
///////////////////////////////////////////////////////////////////////////////
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ

&НаСервере
Функция ИдентификаторОбработки()
	ОбъектОбработка = РеквизитФормыВЗначение("Объект");
	Возврат ОбъектОбработка.Метаданные().ПолноеИмя();
КонецФункции

// Выводит сообщение об ошибке и выставляет параметр Отказ в "Истина". 
// В случае работы на клиенте или на сервере выводит в окно сообщений,
// в случае внешнего соединения вызывает исключение.
//
// Параметры:
//  ТекстСообщения - строка, текст сообщения.
//  Отказ          - булево, признак отказа (необязательный).
//
&НаСервереБезКонтекста
Процедура мСообщитьОбОшибке(ТекстСообщения, Отказ = Ложь, Заголовок = "") Экспорт

	НачалоСлужебногоСообщения    = Найти(ТекстСообщения, "{");
	ОкончаниеСлужебногоСообщения = Найти(ТекстСообщения, "}:");
	Если ОкончаниеСлужебногоСообщения > 0 И НачалоСлужебногоСообщения > 0 Тогда
		ТекстСообщения = Лев(ТекстСообщения, (НачалоСлужебногоСообщения - 1)) + Сред(ТекстСообщения,
			(ОкончаниеСлужебногоСообщения + 2));
	КонецЕсли;

	Отказ = Истина;

	Если ЗначениеЗаполнено(Заголовок) Тогда
		Сообщить(Заголовок);
		Заголовок = "";
	КонецЕсли;

	Сообщить(ТекстСообщения, СтатусСообщения.Важное);

КонецПроцедуры // ОбщегоНазначения.СообщитьОбОшибке()

// Функция "расщепляет" строку на подстроки, используя заданный
//		разделитель. Разделитель может иметь любую длину.
//		Если в качестве разделителя задан пробел, рядом стоящие пробелы
//		считаются одним разделителем, а ведущие и хвостовые пробелы параметра Стр
//		игнорируются.
//		Например,
//		ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(",ку,,,му", ",") возвратит массив значений из пяти элементов,
//		три из которых - пустые строки, а
//		ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(" ку   му", " ") возвратит массив значений из двух элементов
//
//	Параметры:
//		Стр - 			строка, которую необходимо разложить на подстроки.
//						Параметр передается по значению.
//		Разделитель - 	строка-разделитель, по умолчанию - запятая.
//
//
//	Возвращаемое значение:
//		массив значений, элементы которого - подстроки
//
&НаСервере
Функция мРазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",")

	МассивСтрок = Новый Массив;
	Если Разделитель = " " Тогда
		Стр = СокрЛП(Стр);
		Пока 1 = 1 Цикл
			Поз = Найти(Стр, Разделитель);
			Если Поз = 0 Тогда
				МассивСтрок.Добавить(Стр);
				Возврат МассивСтрок;
			КонецЕсли;
			МассивСтрок.Добавить(Лев(Стр, Поз - 1));
			Стр = СокрЛ(Сред(Стр, Поз));
		КонецЦикла;
	Иначе
		ДлинаРазделителя = СтрДлина(Разделитель);
		Пока 1 = 1 Цикл
			Поз = Найти(Стр, Разделитель);
			Если Поз = 0 Тогда
				МассивСтрок.Добавить(Стр);
				Возврат МассивСтрок;
			КонецЕсли;
			МассивСтрок.Добавить(Лев(Стр, Поз - 1));
			Стр = Сред(Стр, Поз + ДлинаРазделителя);
		КонецЦикла;
	КонецЕсли;

КонецФункции // глРазложить

// Функция приводит строковое представление числа к его значению
//
// Параметры:
//  Представление - Представление числа
//  ОписаниеТипов - Допустимое описание типов численного значения
//
// Возвращаемое значение:
//  Значение типа число
//
&НаСервере
Функция мПривестиКЧислу(Представление, Знач ОписаниеТипов = Неопределено, Примечание = "")

	Если ОписаниеТипов = Неопределено Тогда
		ОписаниеТипов = Новый ОписаниеТипов("Число");
	КонецЕсли;

	НРегПредставление = НРег(Представление);
	Если НРегПредставление = "да" Или НРегПредставление = "истина" Или НРегПредставление = "включено" Тогда
		Возврат 1;
	ИначеЕсли НРегПредставление = "нет" Или НРегПредставление = "ложь" Или НРегПредставление = "выключено" Тогда
		Возврат 0;
	КонецЕсли;

	Результат = СтрЗаменить(Представление, " ", "");
	Попытка
		Результат = Число(Результат);
	Исключение
		Примечание = "Неправильный формат числа";
		Возврат 0;
	КонецПопытки;

	Результат1 = ОписаниеТипов.ПривестиЗначение(Результат);

	Если Не Результат1 = Результат Тогда
		Примечание = "Недопустимое числовое значение";
	КонецЕсли;

	Возврат Результат1;

КонецФункции // мПривестиКЧислу()

// Функция приводит строковое представление даты к его значению
//
// Параметры:
//  Представление - Представление числа
//  ОписаниеТипов - Допустимое описание типов значения типа дата
//
// Возвращаемое значение:
//  Значение типа дата
//
&НаСервере
Функция мПривестиКДате(Представление, ТипРеквизита, Примечание = "")

	Результат = ТипРеквизита.ПривестиЗначение(Представление);
	Если Результат = '00010101' Тогда

		МассивЧастей = ПолучитьЧастиПредставленияДаты(Представление);
		Если ТипРеквизита.КвалификаторыДаты.ЧастиДаты = ЧастиДаты.Время Тогда

			Попытка

				Если МассивЧастей.Количество() = 3 Тогда
					Результат = Дата(1, 1, 1, МассивЧастей[0], МассивЧастей[1], МассивЧастей[2]);
				ИначеЕсли МассивЧастей.Количество() = 6 Тогда
					Результат = Дата(1, 1, 1, МассивЧастей[3], МассивЧастей[4], МассивЧастей[5]);
				КонецЕсли;

			Исключение
				Примечание = "Неправильный формат даты";
			КонецПопытки;

		ИначеЕсли МассивЧастей.Количество() = 3 Или МассивЧастей.Количество() = 6 Тогда

			Если МассивЧастей[0] >= 1000 Тогда
				Временно = МассивЧастей[0];
				МассивЧастей[0] = МассивЧастей[2];
				МассивЧастей[2] = Временно;
			КонецЕсли;

			Если МассивЧастей[2] < 100 Тогда
				МассивЧастей[2] = МассивЧастей[2] + ?(МассивЧастей[2] < 30, 2000, 1900);
			КонецЕсли;

			Попытка
				Если МассивЧастей.Количество() = 3 Или ТипРеквизита.КвалификаторыДаты.ЧастиДаты = ЧастиДаты.Дата Тогда
					Результат = Дата(МассивЧастей[2], МассивЧастей[1], МассивЧастей[0]);
				Иначе
					Результат = Дата(МассивЧастей[2], МассивЧастей[1], МассивЧастей[0], МассивЧастей[3],
						МассивЧастей[4], МассивЧастей[5]);
				КонецЕсли;
			Исключение
				Примечание = "Неправильный формат даты";
			КонецПопытки;

		КонецЕсли;

	КонецЕсли;

	Возврат Результат;

КонецФункции

// Функция возвращает части представления даты
//
// Параметры:
//  Представление - Представление даты
//
// Возвращаемое значение:
//  массив частей даты
//
&НаСервере
Функция ПолучитьЧастиПредставленияДаты(Знач Представление)

	МассивЧастей = Новый Массив;
	НачалоЦифры = 0;
	Для к = 1 По СтрДлина(Представление) Цикл

		Символ = Сред(Представление, к, 1);
		ЭтоЦифра = Символ >= "0" И Символ <= "9";

		Если ЭтоЦифра Тогда

			Если НачалоЦифры = 0 Тогда
				НачалоЦифры = к;
			КонецЕсли;

		Иначе

			Если Не НачалоЦифры = 0 Тогда
				МассивЧастей.Добавить(Число(Сред(Представление, НачалоЦифры, к - НачалоЦифры)));
			КонецЕсли;

			НачалоЦифры = 0;
		КонецЕсли;

	КонецЦикла;

	Если Не НачалоЦифры = 0 Тогда
		МассивЧастей.Добавить(Число(Сред(Представление, НачалоЦифры)));
	КонецЕсли;

	Возврат МассивЧастей;
КонецФункции // ()

// Функция возвращает менеджер по типу значения
//
// Параметры:
//  ТипЗначения - Тип значения, по которому нужна вернуть менеджер
//
// Возвращаемое значение:
//  менеджер
&НаСервере
Функция ПолучитьМенеджераПоТипу(ТипЗначения) Экспорт

	Если Не ТипЗначения = Неопределено Тогда
		МенеджерыОбъектовМетаданных = Новый Структура("Справочники, Перечисления, Документы, ПланыВидовХарактеристик, ПланыСчетов, ПланыВидовРасчета, БизнесПроцессы, Задачи",
			Справочники, Перечисления, Документы, ПланыВидовХарактеристик, ПланыСчетов, ПланыВидовРасчета,
			БизнесПроцессы, Задачи);
		Для Каждого МенеджерОбъектаМетаданных Из МенеджерыОбъектовМетаданных Цикл
			Если МенеджерОбъектаМетаданных.Значение.ТипВсеСсылки().СодержитТип(ТипЗначения) Тогда
				Менеджер = МенеджерОбъектаМетаданных.Значение[Метаданные.НайтиПоТипу(ТипЗначения).Имя];
				Прервать;
			КонецЕсли;
		КонецЦикла;
		Возврат Менеджер;
	Иначе
		Возврат Неопределено;
	КонецЕсли;

КонецФункции

&НаСервере
Функция ПолучитьОписаниеТипа(ОписаниеТиповРеквизита) Экспорт

	ОписаниеТипов = "";

	Для Каждого Тип Из ОписаниеТиповРеквизита.Типы() Цикл
		МетаданныеТипа = Метаданные.НайтиПоТипу(Тип);
		Если Не МетаданныеТипа = Неопределено Тогда
			ОписаниеТипа = МетаданныеТипа.ПолноеИмя();
		ИначеЕсли Тип = Тип("Строка") Тогда

			ОписаниеТипа = "Строка";
			Если ОписаниеТиповРеквизита.КвалификаторыСтроки.Длина Тогда
				ОписаниеТипа = ОписаниеТипа + ", " + ОписаниеТиповРеквизита.КвалификаторыСтроки.Длина;
				Если ОписаниеТиповРеквизита.КвалификаторыСтроки.ДопустимаяДлина = ДопустимаяДлина.Фиксированная Тогда
					ОписаниеТипа = ОписаниеТипа + ", " + ДопустимаяДлина.Фиксированная;
				КонецЕсли;
			КонецЕсли;

		ИначеЕсли Тип = Тип("Число") Тогда
			ОписаниеТипа = "Число" + ", " + ОписаниеТиповРеквизита.КвалификаторыЧисла.Разрядность + ", "
				+ ОписаниеТиповРеквизита.КвалификаторыЧисла.РазрядностьДробнойЧасти + ?(
				ОписаниеТиповРеквизита.КвалификаторыЧисла.ДопустимыйЗнак = ДопустимыйЗнак.Неотрицательный,
				", Неотрицательный", "");
		ИначеЕсли Тип = Тип("Дата") Тогда
			ОписаниеТипа = "" + ОписаниеТиповРеквизита.КвалификаторыДаты.ЧастиДаты;
		ИначеЕсли Тип = Тип("Булево") Тогда
			ОписаниеТипа = "Булево";
		Иначе
			Продолжить;
		КонецЕсли;

		ОписаниеТипов = ?(ПустаяСтрока(ОписаниеТипов), "", ОписаниеТипов + Символы.ПС) + ОписаниеТипа;

	КонецЦикла;

	Возврат ОписаниеТипов;

КонецФункции // ПолучитьОписаниеТипа()

////////////////////////////////////////////////////////////////////////////////
//

&НаСервере
Функция мВосстановитьЗначение(Имя)
	Возврат ХранилищеНастроекДанныхФорм.Загрузить(ИдентификаторОбработки(), Имя);
КонецФункции

&НаСервере
Процедура мСохранитьЗначение(Имя, Знач Значение)

	Если ТипЗнч(Значение) = Тип("ДанныеФормыКоллекция") Тогда

		Значение = ДанныеФормыВЗначение(Значение, Тип("ТаблицаЗначений"));

	КонецЕсли;

	ХранилищеНастроекДанныхФорм.Сохранить(ИдентификаторОбработки(), Имя, Значение);

КонецПроцедуры

// Функция возвращает настройку, сохраненную в списке сохраненных настроек
//
// Параметры:
//  Нет
//
// Возвращаемое значение:
//  табличный документ - настройки загружаемых реквизитов
//
&НаСервере
Функция ПолучитьНастройкуПоУмолчанию(СписокНастроек)

	МетаданныеИсточника = ПолучитьМетаданныеИсточника();

	Если МетаданныеИсточника = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	//ТЗ = РеквизитФормыВЗначение("СписокСохраненныхНастроек");
	Для Каждого СтрокаСписка Из СписокНастроек Цикл
		Если СтрокаСписка.Пометка Тогда
			Возврат СтрокаСписка.Значение;
		КонецЕсли;
	КонецЦикла;
	Возврат Неопределено;

КонецФункции // ()

////////////////////////////////////////////////////////////////////////////////
//

// Процедура заполняет список выбора элемента управления "ТабличнаяЧастьИсточника"
//
&НаСервере
Процедура УстановитьСписокТабличныхЧастей()

	СписокВыбора = Элементы.ТабличнаяЧастьИсточника.СписокВыбора;
	СписокВыбора.Очистить();
	Если Объект.СсылкаИсточника = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Для Каждого ТабличнаяЧасть Из Объект.СсылкаИсточника.Метаданные().ТабличныеЧасти Цикл
		СписокВыбора.Добавить(ТабличнаяЧасть.Имя, ТабличнаяЧасть.Представление());
	КонецЦикла;
	Если Не ПустаяСтрока(Объект.ТабличнаяЧастьИсточника) И СписокВыбора.НайтиПоЗначению(Объект.ТабличнаяЧастьИсточника)
		= Неопределено Тогда
		Объект.ТабличнаяЧастьИсточника = "";
	КонецЕсли;

КонецПроцедуры // ()

// Процедура формирует структуру колонок загружаемых реквизитов из табличной части "ТаблицаЗагружаемыхРеквизитов"
//
// Параметры:
//  нет
//
&НаСервере
Процедура СформироватьСтруктуруКолонок()

	НомерКолонки = 1;
	Колонки = Новый Структура;

	ТЗ = РеквизитФормыВЗначение("ТаблицаЗагружаемыхРеквизитов");

	ВремКолонки = ТЗ.СкопироватьКолонки();
	Для Каждого ЗагружаемыйРеквизит Из ТЗ Цикл
		Колонка = Новый Структура;
		Для Каждого КолонкаЗагружаемыхРеквизитов Из ВремКолонки.Колонки Цикл
			Если Не Объект.РучнаяНумерацияКолонокТабличногоДокумента И КолонкаЗагружаемыхРеквизитов.Имя
				= "НомерКолонки" Тогда
				Если ЗагружаемыйРеквизит.Пометка Тогда
					Колонка.Вставить("НомерКолонки", НомерКолонки);
					НомерКолонки = НомерКолонки + 1;
				Иначе
					Колонка.Вставить("НомерКолонки", 0);
				КонецЕсли;
			Иначе
				Колонка.Вставить(КолонкаЗагружаемыхРеквизитов.Имя,
					ЗагружаемыйРеквизит[КолонкаЗагружаемыхРеквизитов.Имя]);
			КонецЕсли;

		КонецЦикла;

		Колонки.Вставить(Колонка.ИмяРеквизита, Колонка);

	КонецЦикла;

	Объект.ДополнительныеСвойства.Вставить("Колонки", Колонки);

КонецПроцедуры // ()

// Процедура формирует шапку табличного документа, в соответствии с таблицей загружаемых реквизитов
//
// Параметры:
//  ТабличныйДокумент - ТабличныйДокумент, у которого необходимо сформировать шапку
//
&НаСервере
Процедура СформироватьШапкуТабличногоДокумента(ТабличныйДокумент)

	Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1);

	ТЗ = РеквизитФормыВЗначение("ТаблицаЗагружаемыхРеквизитов");

	Таблица = ТЗ.Скопировать();
	Таблица.Сортировать("НомерКолонки");

	Колонки = Объект.ДополнительныеСвойства.Колонки;

	Для Каждого КлючИЗначение Из Колонки Цикл
		ЗагружаемыйРеквизит = КлючИЗначение.Значение;
		НомерКолонки = ЗагружаемыйРеквизит.НомерКолонки;
		Если Не ЗагружаемыйРеквизит.Пометка Или НомерКолонки = 0 Тогда
			Продолжить;
		КонецЕсли;

		Если ЗагружаемыйРеквизит.ШиринаКолонки = 0 Тогда

			ШиринаКолонки = 40;
			Если ЗагружаемыйРеквизит.ОписаниеТипов.Типы().Количество() = 1 Тогда
				ПервыйТип = ЗагружаемыйРеквизит.ОписаниеТипов.Типы()[0];
				Если ПервыйТип = Тип("Строка") Тогда
					Если ЗагружаемыйРеквизит.ОписаниеТипов.КвалификаторыСтроки.Длина = 0 Тогда
						ШиринаКолонки = 80;
					Иначе
						ШиринаКолонки = Мин(Макс(ЗагружаемыйРеквизит.ОписаниеТипов.КвалификаторыСтроки.Длина, 10), 80);
					КонецЕсли;
				ИначеЕсли ПервыйТип = Тип("Число") Тогда
					ШиринаКолонки = Макс(ЗагружаемыйРеквизит.ОписаниеТипов.КвалификаторыЧисла.Разрядность, 10);
				ИначеЕсли ПервыйТип = Тип("Булево") Тогда
					ШиринаКолонки = 10;
				КонецЕсли;
			КонецЕсли;
		Иначе
			ШиринаКолонки = ЗагружаемыйРеквизит.ШиринаКолонки;
		КонецЕсли;
		Область = ТабличныйДокумент.Область("R1C" + НомерКолонки);
		БылТекст = Не ПустаяСтрока(Область.Текст);
		Область.Текст       = ?(БылТекст, Область.Текст + Символы.ПС, "") + ЗагружаемыйРеквизит.ПредставлениеРеквизита;
		Область.Расшифровка = ЗагружаемыйРеквизит.ИмяРеквизита;
		Область.ЦветФона = ЦветаСтиля.ЦветФонаФормы;
		Область.Обвести(Линия, Линия, Линия, Линия);

		ОбластьКолонки = ТабличныйДокумент.Область("C" + НомерКолонки);
		ОбластьКолонки.ШиринаКолонки = ?(БылТекст, Макс(ОбластьКолонки.ШиринаКолонки, ШиринаКолонки), ШиринаКолонки);

	КонецЦикла;

КонецПроцедуры // СформироватьШапкуТабличногоДокумента()

// Функция возвращает метаданные источника данных
//
// Параметры:
//  нет
//
// Возвращаемое значение:
//  Объект метаданных
//
&НаСервере
Функция ПолучитьМетаданныеИсточника()

	Если Объект.РежимЗагрузки = 0 Тогда
		Если Не ПустаяСтрока(Объект.ТипОбъектаСправочника) Тогда
			Возврат Метаданные.Справочники.Найти(Объект.ТипОбъектаСправочника);
		КонецЕсли;
	ИначеЕсли Объект.РежимЗагрузки = 1 Тогда
		Если Не Объект.СсылкаИсточника = Неопределено И Не Объект.ТабличнаяЧастьИсточника = Неопределено Тогда
			Возврат Объект.СсылкаИсточника.Метаданные().ТабличныеЧасти.Найти(Объект.ТабличнаяЧастьИсточника);
		КонецЕсли;
	ИначеЕсли Объект.РежимЗагрузки = 2 Тогда
		Если Не ПустаяСтрока(Объект.ИмяВидаРегистра) Тогда
			Возврат Метаданные.РегистрыСведений.Найти(Объект.ИмяВидаРегистра);
		КонецЕсли;
	КонецЕсли;

	Возврат Неопределено;

КонецФункции // ()

&НаСервере
Функция ЕстьВыбранныеМетаданные()

	Возврат Не ПолучитьМетаданныеИсточника() = Неопределено;

КонецФункции // ЕстьВыбранныеМетаданные()

&НаСервере
Функция ПолучитьТекстВопросаИсточника()

	МетаданныеИсточника = ПолучитьМетаданныеИсточника();

	Ошибка = "";
	ТекстВопросаИсточника = "";

	Если Объект.РежимЗагрузки = 0 Тогда
		ТекстВопросаИсточника = " элементов в справочник: """ + МетаданныеИсточника.Представление() + """";

	ИначеЕсли Объект.РежимЗагрузки = 1 Тогда

		Если Объект.СсылкаИсточника.Пустая() Тогда
			Ошибка = "Не выбрана ссылка";
		Иначе
			ОбъектИсточника = Объект.СсылкаИсточника.ПолучитьОбъект();
			ТекстВопросаИсточника = " строк в табличную часть: """ + МетаданныеИсточника.Представление() + """";
		КонецЕсли;

	ИначеЕсли Объект.РежимЗагрузки = 2 Тогда

		ТекстВопросаИсточника = " записей в регистр сведений: """ + МетаданныеИсточника.Представление() + """";

	КонецЕсли;

	Возврат Новый Структура("Ошибка, ТекстВопроса", Ошибка, ТекстВопросаИсточника);

КонецФункции

&НаСервере
Функция ЗагрузитьДанныеСервер()

	ЗаписыватьОбъект = Истина;
	ВозможноСозданиеГруппы = Ложь;

	СформироватьСтруктуруКолонок();

	МетаданныеИсточника = ПолучитьМетаданныеИсточника();

	Колонки = Объект.ДополнительныеСвойства.Колонки;

	Если Объект.РежимЗагрузки = 0 Тогда
		Источник = Справочники[Объект.ТипОбъектаСправочника].ПустаяСсылка();
	ИначеЕсли Объект.РежимЗагрузки = 1 Тогда
		ОбъектИсточника = Объект.СсылкаИсточника.ПолучитьОбъект();
		Источник = ОбъектИсточника[Объект.ТабличнаяЧастьИсточника];
	КонецЕсли;

	ТекстВопросаИсточника = ПолучитьТекстВопросаИсточника().ТекстВопроса;
	КоличествоЭлементов = ТабличныйДокумент.ВысотаТаблицы - Объект.ПерваяСтрокаДанныхТабличногоДокумента + 1;

	Запрос = Неопределено;
	Если Объект.РежимЗагрузки = 0 Тогда

		ВозможноСозданиеГруппы = ВозможноСозданиеГруппы(МетаданныеИсточника);
		СтрокиПоиска = ТаблицаЗагружаемыхРеквизитов.НайтиСтроки(Новый Структура("ПолеПоиска,Пометка", Истина, Истина));
		Если Не СтрокиПоиска.Количество() = 0 Тогда

			ТекстЗапроса = "Выбрать Первые 1
						   |Справочник.Ссылка КАК Ссылка
						   |Из Справочник." + МетаданныеИсточника.Имя + " КАК Справочник
																		|Где";

			Для Каждого СтрокаПоиска Из СтрокиПоиска Цикл
				ТекстЗапроса = ТекстЗапроса + "
											  |Справочник." + СтрокаПоиска.ИмяРеквизита + " = &"
					+ СтрокаПоиска.ИмяРеквизита + "
												  |И";

			КонецЦикла;

			ТекстЗапроса = Лев(ТекстЗапроса, СтрДлина(ТекстЗапроса) - 2);
			Запрос = Новый Запрос(ТекстЗапроса);
		КонецЕсли;
	ИначеЕсли Объект.РежимЗагрузки = 1 Тогда

		Источник.Очистить();
	ИначеЕсли Объект.РежимЗагрузки = 2 Тогда

		ИзмеренияРегистра = Новый Структура;
		Для Каждого Колонка Из Колонки Цикл
			Если Колонка.Значение.МожетБытьПолемПоиска Тогда
				ИзмеренияРегистра.Вставить(Колонка.Ключ, Колонка.Значение);
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	Сообщить("Выполняется загрузка" + ТекстВопросаИсточника, СтатусСообщения.Информация);
	Сообщить("Всего: " + КоличествоЭлементов, СтатусСообщения.Информация);
	Сообщить("---------------------------------------------", СтатусСообщения.БезСтатуса);
	НомерТекущейСтроки = 0;
	Загружено = 0;
	Для К = Объект.ПерваяСтрокаДанныхТабличногоДокумента По ТабличныйДокумент.ВысотаТаблицы Цикл
		НомерТекущейСтроки = НомерТекущейСтроки + 1;
		ТекстыЯчеек = Неопределено;
		Отказ = Ложь;
		ТекущаяСтрока = КонтрольЗаполненияСтроки(ТабличныйДокумент, К, ТекстыЯчеек);
		Если Объект.РежимЗагрузки = 0 Тогда

			ЗагружаемыйОбъект = Неопределено;
			Если Не Запрос = Неопределено Тогда
				СтрокаОшибок = "";
				Для Каждого СтрокаПоиска Из СтрокиПоиска Цикл

					ЗначениеРеквизита = Неопределено;

					ТекущаяСтрока.Свойство(СтрокаПоиска.ИмяРеквизита, ЗначениеРеквизита);
					Если ПустаяСтрока(ЗначениеРеквизита) Тогда
						СтрокаОшибок = ?(ПустаяСтрока(СтрокаОшибок), "", СтрокаОшибок + ", ")
							+ СтрокаПоиска.ПредставлениеРеквизита;
					Иначе
						Запрос.УстановитьПараметр(СтрокаПоиска.ИмяРеквизита, ТекущаяСтрока[СтрокаПоиска.ИмяРеквизита]);
					КонецЕсли;

				КонецЦикла;

				Если Не ПустаяСтрока(СтрокаОшибок) Тогда
					Сообщить("Строка " + НомерТекущейСтроки
						+ " не может быть записана.Не указано значение ключевых реквизитов: " + СтрокаОшибок,
						СтатусСообщения.Важное);
					Продолжить;
				КонецЕсли;

				Выборка = Запрос.Выполнить().Выбрать();
				Если Выборка.Следующий() Тогда
					ЗагружаемыйОбъект = Выборка.Ссылка.ПолучитьОбъект();
				КонецЕсли;

			КонецЕсли;

			ОбъектНайден = Не ЗагружаемыйОбъект = Неопределено;
			Если Не ОбъектНайден Тогда
				Если Объект.НеСоздаватьНовыхЭлементов Тогда
					Продолжить;
				ИначеЕсли ВозможноСозданиеГруппы И ТекущаяСтрока.ЭтоГруппа Тогда
					ЗагружаемыйОбъект = Справочники[МетаданныеИсточника.Имя].СоздатьГруппу();
				Иначе
					ЗагружаемыйОбъект = Справочники[МетаданныеИсточника.Имя].СоздатьЭлемент();
				КонецЕсли;

			КонецЕсли;
		ИначеЕсли Объект.РежимЗагрузки = 1 Тогда
			ЗагружаемыйОбъект = Источник.Добавить();
			ОбъектНайден = Ложь;
		ИначеЕсли Объект.РежимЗагрузки = 2 Тогда
			ЗагружаемыйОбъект = РегистрыСведений[МетаданныеИсточника.Имя].СоздатьМенеджерЗаписи();
			Для Каждого КлючИЗначение Из ТекущаяСтрока Цикл

				Если ИзмеренияРегистра.Свойство(КлючИЗначение.Ключ) Тогда
					ЗагружаемыйОбъект[КлючИЗначение.Ключ] = КлючИЗначение.Значение;
				КонецЕсли;

			КонецЦикла;

			Если Не Объект.ЗамещатьСуществующиеЗаписи Тогда
				ЗагружаемыйОбъект.Прочитать();
				ОбъектНайден = ЗагружаемыйОбъект.Выбран();
			Иначе
				ОбъектНайден = Ложь;
			КонецЕсли;

		КонецЕсли;

		Для Каждого КлючИЗначение Из ТекущаяСтрока Цикл
			
			Если КлючИЗначение.Ключ = "ЭтоГруппа" Тогда
				Продолжить;	
			КонецЕсли; 

			Если Не ОбъектНайден Или Колонки[КлючИЗначение.Ключ].Пометка Тогда
				Попытка
					ЗагружаемыйОбъект[КлючИЗначение.Ключ] = КлючИЗначение.Значение;
				Исключение
					мСообщитьОбОшибке("Ошибка при установки значения реквизита """ + КлючИЗначение.Ключ + ""
						+ ОписаниеОшибки());
					Отказ = Истина;
					Прервать;
				КонецПопытки;
			КонецЕсли;

		КонецЦикла;

		Если Объект.РежимЗагрузки = 0 Тогда
			Если Не Отказ И ЗаписатьОбъект(ЗагружаемыйОбъект, ТекстыЯчеек, Объект.ПередЗаписьюОбъекта,
				Объект.ПриЗаписиОбъекта) Тогда
				Сообщить(?(ОбъектНайден, "Изменен", "Загружен") + ?(ЗагружаемыйОбъект.ЭтоГруппа, " группа", " элемент") 
							+ " справочника: " + ЗагружаемыйОбъект.Ссылка,
						СтатусСообщения.Информация);
				Загружено = Загружено + 1;
			Иначе
				Сообщить("Объект не " + ?(ОбъектНайден, "изменен", "загружен") + ". " 
						+ ?(ЗагружаемыйОбъект.ЭтоГруппа, " Группа", " Элемент") + " справочника: "
					+ ЗагружаемыйОбъект + ".", СтатусСообщения.Важное);
			КонецЕсли;
		ИначеЕсли Объект.РежимЗагрузки = 1 Тогда

			Если Не ОбработатьСобытиеПослеДобавленияСтроки(ОбъектИсточника, ЗагружаемыйОбъект, ТекстыЯчеек,
				Объект.ПослеДобавленияСтроки) Тогда
				Отказ = Истина;
			КонецЕсли;

			Если Не Отказ Тогда
				Сообщить("Добавлена строка: " + (Загружено + 1));
			Иначе
				Сообщить("При добавлении строки " + (Загружено + 1) + " возникли ошибки. ");
				ЗаписыватьОбъект = Ложь;
			КонецЕсли;

			Загружено = Загружено + 1;

		ИначеЕсли Объект.РежимЗагрузки = 2 Тогда
			Если Не Отказ И ЗаписатьОбъект(ЗагружаемыйОбъект, ТекстыЯчеек, Объект.ПередЗаписьюОбъекта,
				Объект.ПриЗаписиОбъекта) Тогда
				Сообщить(?(ОбъектНайден, "Изменена", "Добавлена") + " запись № " + НомерТекущейСтроки + ".");
				Загружено = Загружено + 1;
			Иначе
				Сообщить("Запись не " + ?(ОбъектНайден, "изменена", "загружена") + ". № записи: " + НомерТекущейСтроки
					+ ".", СтатусСообщения.Важное);
			КонецЕсли;
		КонецЕсли;

	КонецЦикла;
	Сообщить("---------------------------------------------", СтатусСообщения.БезСтатуса);

	Если Объект.РежимЗагрузки = 1 Тогда
		Если ЗаписыватьОбъект И ЗаписатьОбъект(ОбъектИсточника, "", Объект.ПередЗаписьюОбъекта,
			Объект.ПриЗаписиОбъекта) Тогда

			Сообщить("Выполнена загрузка" + ТекстВопросаИсточника, СтатусСообщения.Информация);
			Сообщить("" + Загружено + " из " + КоличествоЭлементов + " элементов.", СтатусСообщения.Информация);
			Возврат Истина;
		Иначе
			Сообщить("Объект не записан: " + ЗагружаемыйОбъект + ".", СтатусСообщения.Важное);
			Возврат Ложь;
		КонецЕсли;
	ИначеЕсли Объект.РежимЗагрузки = 0 Тогда
		Сообщить("Выполнена загрузка" + ТекстВопросаИсточника, СтатусСообщения.Информация);
		Сообщить("" + Загружено + " из " + КоличествоЭлементов + " элементов.", СтатусСообщения.Информация);
		Возврат Истина;
	ИначеЕсли Объект.РежимЗагрузки = 2 Тогда
		Сообщить("Выполнена загрузка" + ТекстВопросаИсточника, СтатусСообщения.Информация);
		Сообщить("" + Загружено + " из " + КоличествоЭлементов + " записей.", СтатусСообщения.Информация);
		Возврат Истина;
	КонецЕсли;

КонецФункции

// Функция определяет возможность создания группы для переданного метаданного
//
// Параметры:
//  МетаданныеИсточника - Метаданные - Метаданные загружаемого объекта
//
// Возвращаемое значение:
//  Булево - признак возможности создания группы
//
&НаСервере
Функция ВозможноСозданиеГруппы(Знач МетаданныеИсточника)
	
	Возврат МетаданныеИсточника.Иерархический 
			И МетаданныеИсточника.ВидИерархии = Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияГруппИЭлементов;

КонецФункции // ()

// Функция вычисляет значение ячейки для режима "Вычислять"
//
// Параметры:
//  Выражение - програмный код, который необходимо выполнить
//  ТекущиеДанные  - структура загруженных значений
//  ТекстЯчейки    - текст текущей ячейки
//  ТекстыЯчеек    - массив текстов ячеек строки
//  Результат      - результат вычисления
//
// Возвращаемое значение:
//  Структура, сордержащая Результат и ОписаниеОшибки
&НаСервереБезКонтекста
Функция ВычислитьЗначениеЯчейки(Знач Выражение, Знач ТекущиеДанные, Знач ТекстЯчейки, Знач ТекстыЯчеек, Знач Результат)

	ТекстЯчейки = СокрЛП(ТекстЯчейки);
	ОписаниеОшибки = "";
	Попытка
		Выполнить (Выражение);
	Исключение
		мСообщитьОбОшибке(ОписаниеОшибки());
	КонецПопытки;

	Возврат Новый Структура("Результат,ОписаниеОшибки", Результат, ОписаниеОшибки);

КонецФункции // ВычислитьЗначениеЯчейки(ТекущаяСтрока,Представление)()

// Функция записывает объект в информационную базу данных, используя
// события определенные пользователем в форме редактирования событий
//
// Параметры:
//  Объект      - записываемый объект
//  ТекстыЯчеек - массив текстов ячеек, загружаемой строки
//
// Возвращаемое значение:
//  Истина, если объект записан, Ложь - иначе
//
&НаСервереБезКонтекста
Функция ЗаписатьОбъект(Объект, ТекстыЯчеек = Неопределено, ПередЗаписьюОбъекта, ПриЗаписиОбъекта)

	Отказ = Ложь;
	НачатьТранзакцию();
	Если Не ПустаяСтрока(ПередЗаписьюОбъекта) Тогда
		Попытка
			Выполнить (ПередЗаписьюОбъекта);
			Если Отказ Тогда
				ОписаниеОшибки = "";//Установлен отказ перед записью объекта
			КонецЕсли;
		Исключение
			Отказ = Истина;
			ОписаниеОшибки = ОписаниеОшибки();
		КонецПопытки;
	КонецЕсли;

	Если Не Отказ Тогда
		Попытка
			Объект.Записать();
		Исключение
			Отказ = Истина;
			ОписаниеОшибки = ОписаниеОшибки();
		КонецПопытки;
	КонецЕсли;

	Если Не Отказ И Не ПустаяСтрока(ПриЗаписиОбъекта) Тогда

		Попытка
			Выполнить (ПриЗаписиОбъекта);
			Если Отказ Тогда
				ОписаниеОшибки = "";//Установлен отказ при записи объекта
			КонецЕсли;

		Исключение
			Отказ = Истина;
			ОписаниеОшибки = ОписаниеОшибки();
		КонецПопытки;

		Если Не Отказ Тогда
			Попытка
				Объект.Записать();
			Исключение
				Отказ = Истина;
				ОписаниеОшибки = ОписаниеОшибки();
			КонецПопытки;
		КонецЕсли;

	КонецЕсли;

	Если Не Отказ Тогда
		ЗафиксироватьТранзакцию();
	Иначе
		мСообщитьОбОшибке(ОписаниеОшибки);
		ОтменитьТранзакцию();
	КонецЕсли;

	Возврат Не Отказ;

КонецФункции // ()

// Функция обрабатывает событие "После добавления строки",
// определенное пользователем в форме редактирования событий
//
// Параметры:
//  Объект      - записываемый объект
//  ТекущиеДанные  - структура загруженных значений
//  ТекстыЯчеек    - массив текстов ячеек строки
//
// Возвращаемое значение:
//  Истина, если в событие "После добавления строки" не был установлен Отказ, Ложь - иначе
//
&НаСервереБезКонтекста
Функция ОбработатьСобытиеПослеДобавленияСтроки(Объект, ТекущиеДанные, ТекстыЯчеек, ПослеДобавленияСтроки)

	Попытка

		Выполнить (ПослеДобавленияСтроки);

	Исключение

		мСообщитьОбОшибке(ОписаниеОшибки());
		Возврат Ложь;

	КонецПопытки;

	Возврат Истина;

КонецФункции // ()

////////////////////////////////////////////////////////////////////////////////
//

// Процедура выполняет контроль заполнения данных табличного документа
// сообщает об ошибках и устанавливает коментарии к ошибочным ячейкам
//
// Параметры:
//  ТабличныйДокумент - ТабличныйДокумент, у которого необходимо сформировать шапку
//  Индикатор         - Элемент управления индикатор, в котором необходимо отображать процент выполнения операции
//
&НаСервере
Процедура КонтрольЗаполнения(ТабличныйДокумент) Экспорт

	КоличествоЭлементов = ТабличныйДокумент.ВысотаТаблицы - Объект.ПерваяСтрокаДанныхТабличногоДокумента + 1;

	КоличествоОшибок = 0;
	Для К = 0 По КоличествоЭлементов - 1 Цикл
		//Состояние("Выполняется контроль заполнения строки № " + (К + 1));
		КонтрольЗаполненияСтроки(ТабличныйДокумент, К + Объект.ПерваяСтрокаДанныхТабличногоДокумента, ,
			КоличествоОшибок);
	КонецЦикла;

	Сообщить("Контроль заполнения завершен. Проверено строк: " + КоличествоЭлементов);
	Если КоличествоОшибок Тогда
		Сообщить("Выявлено ячеек, содержащих ошибки/неоднозначное представление: " + КоличествоОшибок);
	Иначе
		Сообщить("Ячеек, содержащих ошибки не выявлено");
	КонецЕсли;

КонецПроцедуры // КонтрольЗаполнения()

// Функция выполняет контроль заполнения строки данных табличного документа
// сообщает об ошибках и устанавливает коментарии к ошибочным ячейкам
//
// Параметры:
//  ТабличныйДокумент - ТабличныйДокумент, у которого необходимо сформировать шапку
//  НомерСтроки       - Число, номер строки табличного документа
//  ТекстыЯчеек    - возвращает массив текстов ячеек строки,
//
// Возвращаемое значение:
//  структура, ключ - Имя загружаемого реквизита, Значение - Значение загружаемого реквизита
//
&НаСервере
Функция КонтрольЗаполненияСтроки(ТабличныйДокумент, НомерСтроки, ТекстыЯчеек = Неопределено, КоличествоОшибок = 0)

	ТекстыЯчеек = Новый Массив;
	ТекстыЯчеек.Добавить(Неопределено);
	Для к = 1 По ТабличныйДокумент.ШиринаТаблицы Цикл
		ТекстыЯчеек.Добавить(СокрЛП(ТабличныйДокумент.Область("R" + Формат(НомерСтроки, "ЧГ=") + "C" + Формат(К,
			"ЧГ=")).Текст));
	КонецЦикла;

	Колонки = Объект.ДополнительныеСвойства.Колонки;

	ТекущаяСтрока     = Новый Структура;
	Для Каждого КлючИЗначение Из Колонки Цикл

		Колонка = КлючИЗначение.Значение;

		Если Колонка.Пометка Тогда

			Если Колонка.РежимЗагрузки = "Устанавливать" Тогда

				Результат = Колонка.ЗначениеПоУмолчанию;
				ТекущаяСтрока.Вставить(Колонка.ИмяРеквизита, Результат);

			ИначеЕсли Не Колонка.НомерКолонки = 0 Тогда

				Если Не ОбработатьОбласть(ТабличныйДокумент.Область("R" + Формат(НомерСтроки, "ЧГ=") + "C" + Формат(
					Колонка.НомерКолонки, "ЧГ=")), Колонка, ТекущаяСтрока, ТекстыЯчеек) Тогда
					КоличествоОшибок = КоличествоОшибок + 1;
				КонецЕсли;

			ИначеЕсли Колонка.РежимЗагрузки = "Вычислять" Тогда

				Вычисление  = ВычислитьЗначениеЯчейки(Колонка.Выражение, ТекущаяСтрока, "", ТекстыЯчеек,
					Колонка.ЗначениеПоУмолчанию);
				Результат   = Вычисление.Результат;
				Примечание  = Вычисление.ОписаниеОшибки;

				Если Не ЗначениеЗаполнено(Результат) Тогда
					Результат = Колонка.ЗначениеПоУмолчанию;
				КонецЕсли;

				ТекущаяСтрока.Вставить(Колонка.ИмяРеквизита, Результат);

				Если Не ПустаяСтрока(Примечание) Тогда
					Сообщить("Строка [" + НомерСтроки + "](" + Колонка.ПредставлениеРеквизита + "): " + Примечание);
					КоличествоОшибок = КоличествоОшибок + 1;
				КонецЕсли;

			КонецЕсли;

		КонецЕсли;

	КонецЦикла;
	Возврат ТекущаяСтрока;

КонецФункции

// Процедура выполняет обработку области табличного документа:
// заполняет расшифровку по представлению ячейки в соответствии со структурой загружаемых реквизитов
// сообщает об ошибке и устанавливает коментарий, если ячейка содержит ошибку
//
// Параметры:
//  Область - область табличного документа
//  Колонка - Структура, свойства, в соответствии с которыми необходимо выполнить обработку области
//  ТекущиеДанные  - структура загруженных значений
//  ТекстыЯчеек    - массив текстов ячеек строки
//
&НаСервере
Функция ОбработатьОбласть(Область, Колонка, ТекущиеДанные, ТекстыЯчеек)

	Представление = Область.Текст;
	Примечание = "";

	Если Колонка.РежимЗагрузки = "Вычислять" Тогда

		Вычисление = ВычислитьЗначениеЯчейки(Колонка.Выражение, ТекущиеДанные, Представление, ТекстыЯчеек,
			Колонка.ЗначениеПоУмолчанию);
		Если Не ПустаяСтрока(Вычисление.ОписаниеОшибки) Тогда
			Результат   = Неопределено;
			Примечание = "" + Вычисление.ОписаниеОшибки;
		Иначе
			Результат = Вычисление.Результат;
		КонецЕсли;

	ИначеЕсли ПустаяСтрока(Представление) Тогда
		Результат = Неопределено;
	Иначе
		НайденныеЗначения = ПолучитьВозможныеЗначения(Колонка, Представление, Примечание, ТекущиеДанные);

		Если НайденныеЗначения.Количество() = 0 Тогда

			Примечание = "Не найден" + ?(Примечание = "", "", Символы.ПС + Примечание);
			Результат = Неопределено;

		ИначеЕсли НайденныеЗначения.Количество() = 1 Тогда

			Результат = НайденныеЗначения[0];
		Иначе

			Примечание = "Не однозначное представление. Вариантов: " + НайденныеЗначения.Количество() + ?(Примечание
				= "", "", Символы.ПС + Примечание);

			Нашли = Ложь;
			НашлиЗначениеПоУмолчанию = Ложь;
			Для Каждого НайденноеЗначение Из НайденныеЗначения Цикл
				Если НайденноеЗначение = Область.Расшифровка Тогда
					Нашли = Истина;
					Прервать;
				КонецЕсли;
				Если НайденноеЗначение = Колонка.ЗначениеПоУмолчанию Тогда
					НашлиЗначениеПоУмолчанию = Истина;
				КонецЕсли;
			КонецЦикла;

			Если Не Нашли Тогда

				Если НашлиЗначениеПоУмолчанию Тогда
					НайденноеЗначение = Колонка.ЗначениеПоУмолчанию;
				Иначе
					НайденноеЗначение = НайденныеЗначения[0];
				КонецЕсли;
			КонецЕсли;
			Результат = НайденноеЗначение;
		КонецЕсли;
	КонецЕсли;

	Если Не ЗначениеЗаполнено(Результат) Тогда
		Результат = Колонка.ЗначениеПоУмолчанию;
	КонецЕсли;

	ТекущиеДанные.Вставить(Колонка.ИмяРеквизита, Результат);

	Область.Расшифровка = Результат;
	Область.Примечание.Текст = Примечание;

	Если Не ПустаяСтрока(Примечание) Тогда
		Сообщить("Ячейка[" + Область.Имя + "](" + Колонка.ПредставлениеРеквизита + "): " + Примечание);
	КонецЕсли;

	Возврат ПустаяСтрока(Примечание);

КонецФункции

// Функция возвращает массив возможных значений для текущей колонки по представлению
//
// Параметры:
//  Колонка - Структура, свойства, в соответствии с которыми необходимо получить возможные значения
//  Представление - Строка, по которой необходимо вернуть массив значений
//  Примечание    - массив текстов ячеек строки
//  ТекущиеДанные  - структура загруженных значений
//
// Возвращаемое значение:
//  массив возможных значений
//
&НаСервере
Функция ПолучитьВозможныеЗначения(Колонка, Представление, Примечание, ТекущиеДанные)
	Примечание = "";

	НайденныеЗначения = Новый Массив;

	Если ПустаяСтрока(Представление) Тогда

		Возврат НайденныеЗначения;

	Иначе
		СвязьПоТипу = Неопределено;
		Если Не ПустаяСтрока(Колонка.СвязьПоТипу) Тогда

			Если ТипЗНЧ(Колонка.СвязьПоТипу) = Тип("Строка") Тогда
				ТекущиеДанные.Свойство(Колонка.СвязьПоТипу, СвязьПоТипу);
			Иначе
				СвязьПоТипу = Колонка.СвязьПоТипу;
			КонецЕсли;
			Если Не СвязьПоТипу = Неопределено Тогда

				ЭлементСвязиПоТипу = Колонка.ЭлементСвязиПоТипу;
				Если ЭлементСвязиПоТипу = 0 Тогда
					ЭлементСвязиПоТипу = 1;
				КонецЕсли;
				ВидыСубконто = СвязьПоТипу.ВидыСубконто;
				Если ЭлементСвязиПоТипу > ВидыСубконто.Количество() Тогда
					Возврат НайденныеЗначения;
				КонецЕсли;
				Тип = СвязьПоТипу.ВидыСубконто[ЭлементСвязиПоТипу - 1].ВидСубконто.ТипЗначения;
			Иначе
				Тип = Колонка.ОписаниеТипов;
			КонецЕсли;

		Иначе
			Тип = Колонка.ОписаниеТипов;
		КонецЕсли;
	КонецЕсли;
	ПримитивныеТипы = Новый Структура("Число, Строка, Дата, Булево", Тип("Число"), Тип("Строка"), Тип("Дата"), Тип(
		"Булево"));
	Для Каждого ТипРеквизита Из Тип.Типы() Цикл

		Если ТипРеквизита = ПримитивныеТипы.Число Или ТипРеквизита = ПримитивныеТипы.Булево Тогда
			НайденныеЗначения.Добавить(мПривестиКЧислу(Представление, Колонка.ОписаниеТипов, Примечание));
		ИначеЕсли ТипРеквизита = ПримитивныеТипы.Строка Или ТипРеквизита = ПримитивныеТипы.Дата Тогда
			НайденныеЗначения.Добавить(мПривестиКДате(Представление, Колонка.ОписаниеТипов, Примечание));

		Иначе

			МетаданныеТипа = Метаданные.НайтиПоТипу(ТипРеквизита);

			Если Перечисления.ТипВсеСсылки().СодержитТип(ТипРеквизита) Тогда
				
				//Это Перечисление
				Для Каждого Перечисление Из ПолучитьМенеджераПоТипу(ТипРеквизита) Цикл
					Если Строка(Перечисление) = Представление Тогда
						НайденныеЗначения.Добавить(Перечисление);
					КонецЕсли;
				КонецЦикла;

			ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(ТипРеквизита) Тогда
				
				//Это документ

				Менеджер = ПолучитьМенеджераПоТипу(ТипРеквизита);
				Если Колонка.ИскатьПо = "Номер" Тогда
					//НайденноеЗначение = Менеджер.НайтиПоКоду(Представление);
				ИначеЕсли Колонка.ИскатьПо = "Дата" Тогда
					//НайденноеЗначение = Менеджер.Найти
				Иначе

					ДлиннаСинонима = СтрДлина("" + МетаданныеТипа);

					Если Лев(Представление, ДлиннаСинонима) = "" + МетаданныеТипа Тогда
						НомерИДата = СокрЛП(Сред(Представление, ДлиннаСинонима + 1));
						ПозицияОт = Найти(НомерИДата, " от ");
						Если Не ПозицияОт = 0 Тогда
							НомерДок = Лев(НомерИДата, ПозицияОт - 1);
							Попытка
								ДатаДок  = Дата(Сред(НомерИДата, ПозицияОт + 4));
							Исключение
								ДатаДок = Неопределено;
							КонецПопытки;
							Если Не ДатаДок = Неопределено Тогда
								НайденноеЗначение = Менеджер.НайтиПоНомеру(НомерДок, ДатаДок);
								Если Не НайденноеЗначение.Пустая() Тогда
									НайденныеЗначения.Добавить(НайденноеЗначение);
								КонецЕсли;
							КонецЕсли;
						КонецЕсли;
					КонецЕсли;

				КонецЕсли;

			ИначеЕсли Не МетаданныеТипа = Неопределено Тогда

				ИскатьПо = Колонка.ИскатьПо;
				ЭтоСправочник = Справочники.ТипВсеСсылки().СодержитТип(ТипРеквизита);
				Если ПустаяСтрока(ИскатьПо) Тогда
					СтрокаОсновногоПредставления = Строка(МетаданныеТипа.ОсновноеПредставление);

					Если СтрокаОсновногоПредставления = "ВВидеКода" Тогда
						ИскатьПо = "Код";
					ИначеЕсли СтрокаОсновногоПредставления = "ВВидеНаименования" Тогда
						ИскатьПо = "Наименование";
					ИначеЕсли СтрокаОсновногоПредставления = "ВВидеНомера" Тогда
						ИскатьПо = "Номер";
					КонецЕсли;
				КонецЕсли;
				Запрос = Новый Запрос;
				Запрос.Текст = "ВЫБРАТЬ
							   |	_Таблица.Ссылка
							   |ИЗ
							   |	" + МетаданныеТипа.ПолноеИмя() + " КАК _Таблица
																	 |ГДЕ";

				Запрос.Текст = Запрос.Текст + "
											  |	_Таблица." + ИскатьПо + " = &Представление";
				Запрос.УстановитьПараметр("Представление", Представление);

				Если ЭтоСправочник И Не ПустаяСтрока(Колонка.СвязьПоВладельцу) И МетаданныеТипа.Владельцы.Количество() Тогда

					СвязьПоВладельцу = Неопределено;
					Если ТипЗНЧ(Колонка.СвязьПоВладельцу) = Тип("Строка") Тогда
						ТекущиеДанные.Свойство(Колонка.СвязьПоВладельцу, СвязьПоВладельцу);
					Иначе
						СвязьПоВладельцу = Колонка.СвязьПоВладельцу;
					КонецЕсли;

					Если Не СвязьПоВладельцу = Неопределено Тогда
						Запрос.Текст = Запрос.Текст + "
													  |	И _Таблица.Владелец = &СвязьПоВладельцу";
						Запрос.УстановитьПараметр("СвязьПоВладельцу", СвязьПоВладельцу);
					КонецЕсли;

				КонецЕсли;

				Выборка =  Запрос.Выполнить().Выбрать();

				Пока Выборка.Следующий() Цикл
					НайденныеЗначения.Добавить(Выборка.Ссылка);
				КонецЦикла;
			Иначе
				Примечание = "Не описан способ поиска";
				Примечание = "Для Колонки не определен тип значения";
			КонецЕсли;
		КонецЕсли;

	КонецЦикла;
	Возврат НайденныеЗначения;
КонецФункции // ()

////////////////////////////////////////////////////////////////////////////////
//

// Функция возвращает массив, элементами которого выступают возможные имена представления загружаемого реквизита
//
// Параметры:
//  ЗагружаемыйРеквизит - Строка таблицы значений загружаемого реквизита
//
// Возвращаемое значение:
//  список значений; значение списка - строка имя представления
//
&НаСервере
Функция ПолучитьСписокИменПредставлений(ОписаниеТипов)

	СписокВыбора = Новый СписокЗначений;
	Если ОписаниеТипов.Типы().Количество() = 1 Тогда

		Тип = ОписаниеТипов.Типы()[0];

		МетаданныеТипа      = Метаданные.НайтиПоТипу(Тип);
		ЭтоСправочник       = Справочники.ТипВсеСсылки().СодержитТип(Тип);
		ЭтоСчет             = ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип);
		ЭтоВидХарактеристик = ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип);
		Если ЭтоСправочник Или ЭтоСчет Или ЭтоВидХарактеристик Тогда

			ЕстьКод = МетаданныеТипа.ДлинаКода > 0;
			ЕстьИмя = МетаданныеТипа.ДлинаНаименования > 0;

			ВидОсновногоПредставление = ?(ЭтоСправочник, Метаданные.СвойстваОбъектов.ОсновноеПредставлениеСправочника,
				?(ЭтоСчет, Метаданные.СвойстваОбъектов.ОсновноеПредставлениеСчета,
				Метаданные.СвойстваОбъектов.ОсновноеПредставлениеВидаХарактеристики));

			Если МетаданныеТипа.ОсновноеПредставление = ВидОсновногоПредставление.ВВидеКода Тогда

				Если ЕстьКод Тогда
					СписокВыбора.Добавить("Код", "Код");
				КонецЕсли;

				Если ЕстьИмя Тогда
					СписокВыбора.Добавить("Наименование", "Наименование");
				КонецЕсли;

			Иначе

				Если ЕстьИмя Тогда
					СписокВыбора.Добавить("Наименование", "Наименование");
				КонецЕсли;

				Если ЕстьКод Тогда
					СписокВыбора.Добавить("Код", "Код");
				КонецЕсли;

			КонецЕсли;

			Для Каждого Реквизит Из МетаданныеТипа.Реквизиты Цикл

				Если Не Реквизит.Индексирование = Метаданные.СвойстваОбъектов.Индексирование.НеИндексировать
					И Реквизит.Тип.Типы().Количество() = 1 И Реквизит.Тип.Типы()[0] = Тип("Строка") Тогда

					СписокВыбора.Добавить(Реквизит.Имя, Реквизит.Представление());

				КонецЕсли;

			КонецЦикла;
		Иначе
		
		КонецЕсли;

	КонецЕсли;
	Возврат СписокВыбора;
КонецФункции // ()

// Функция возвращает список, элементами которого выступают возможные связи по типу для загружаемого реквизита
//
// Параметры:
//  ЗагружаемыйРеквизит - Строка таблицы значений загружаемого реквизита
//
// Возвращаемое значение:
//  список значений; значение списка - строка имя колонки связи или ссылка на элемент связи
//
&НаСервере
Функция ПолучитьСписокСвязейПоТипу(ЗагружаемыйРеквизит, ТЗ)

	СписокВыбора = Новый СписокЗначений;

	ВозможныеПланыСчетов = Новый Структура;
	Для Каждого ПланСчетов Из Метаданные.ПланыСчетов Цикл
		Попытка
			Если ПланСчетов.ВидыСубконто.Тип = ЗагружаемыйРеквизит.ОписаниеТипов Тогда

				ВозможныеПланыСчетов.Вставить(ПланСчетов.Имя, ПланыСчетов[ПланСчетов.Имя]);

			КонецЕсли;
		Исключение

		КонецПопытки;
	КонецЦикла;

	Для Каждого ПланСчетов Из ВозможныеПланыСчетов Цикл
		ТипЗНЧПланСчетов = ТипЗНЧ(ПланСчетов.Значение.ПустаяСсылка());
		Для Каждого КолонкаСвязиПоТипу Из ТЗ Цикл
			Если КолонкаСвязиПоТипу.ОписаниеТипов.Типы()[0] = ТипЗНЧПланСчетов Тогда
				СписокВыбора.Добавить(КолонкаСвязиПоТипу.ИмяРеквизита, КолонкаСвязиПоТипу.ИмяРеквизита);
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;

	Если Не ВозможныеПланыСчетов.Количество() = 0 Тогда
		СписокВыбора.Добавить(Неопределено, "< пустое значение >");
	КонецЕсли;

	Для Каждого ПланСчетов Из ВозможныеПланыСчетов Цикл
		СписокВыбора.Добавить("ПланСчетовСсылка." + ПланСчетов.Ключ, "<" + ПланСчетов.Ключ + ">");
	КонецЦикла;

	Возврат СписокВыбора;
КонецФункции // ()

// Функция возвращает список, элементами которого выступают возможные связи по владельцу для загружаемого реквизита
//
// Параметры:
//  ЗагружаемыйРеквизит - Строка таблицы значений загружаемого реквизита
//
// Возвращаемое значение:
//  список значений; значение списка - строка имя колонки связи или ссылка на элемент связи
//
&НаСервере
Функция ПолучитьСписокСвязейПоВладельцу(ОписаниеТипов, ТаблицаКолонок)

	ЕстьТипСамогоОбъекта = Ложь;
	МетаданныеИсточника = ПолучитьМетаданныеИсточника();
	Если Объект.РежимЗагрузки = 0 Тогда
		ОписаниеТиповСправочника = Тип(СтрЗаменить(МетаданныеИсточника.ПолноеИмя(), ".", "Ссылка."));
	Иначе
		ОписаниеТиповСправочника = Неопределено;
	КонецЕсли;

	СписокВыбора = Новый СписокЗначений;
	ТипыВладельцев = Новый Соответствие;
	Для Каждого ТипКолонки Из ОписаниеТипов.Типы() Цикл
		Если Справочники.ТипВсеСсылки().СодержитТип(ТипКолонки) Тогда
			Для Каждого Владелец Из Метаданные.НайтиПоТипу(ТипКолонки).Владельцы Цикл
				ТипВладельца   = Тип(СтрЗаменить(Владелец.ПолноеИмя(), ".", "Ссылка."));
				Если ТипыВладельцев[ТипВладельца] = Неопределено Тогда

					Если ТипВладельца = ОписаниеТиповСправочника Тогда

						ЕстьТипСамогоОбъекта = Истина;

					КонецЕсли;

					ТипыВладельцев.Вставить(Владелец.ПолноеИмя(), Владелец.ПолноеИмя());
					Для Каждого КолонкаСвязиПоВладельцу Из ТаблицаКолонок Цикл
						Если КолонкаСвязиПоВладельцу.ОписаниеТипов.Типы()[0] = ТипВладельца
							И СписокВыбора.НайтиПоЗначению(КолонкаСвязиПоВладельцу.ИмяРеквизита) = Неопределено Тогда
							// Возможно надо будет по всем типам проходить
							СписокВыбора.Добавить(КолонкаСвязиПоВладельцу.ИмяРеквизита,
								КолонкаСвязиПоВладельцу.ИмяРеквизита);
						КонецЕсли;
					КонецЦикла;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;

	Если Не ТипыВладельцев.Количество() = 0 Тогда
		СписокВыбора.Добавить(Неопределено, "< пустое значение >");
	КонецЕсли;
	Для Каждого КлючИЗначение Из ТипыВладельцев Цикл
		СписокВыбора.Добавить(КлючИЗначение.Значение, "<" + КлючИЗначение.Значение + ">");
	КонецЦикла;

	Если ЕстьТипСамогоОбъекта Тогда

		СписокВыбора.Вставить(0, "<Создаваемый объект>", "<Создаваемый объект>");

	КонецЕсли;

	Возврат СписокВыбора;

КонецФункции // ()

// Возвращает список выбора, закэшированный в таблице значений для реквизита
//
// Параметры
//  ИмяРеквизита  - Строка - Имя реквизита, для которого нужно
//		получить связанный список выбора
//
// Возвращаемое значение:
//   СписокЗначений - список значений для выбора для этого реквизита
//
&НаСервере
Функция ПолучитьСписокВыбораСвязиПоВладельцу(ИмяРеквизита)

	ТЗ = РеквизитФормыВЗначение("СпискиВыбораСвязиПоВладельцу");
	Стр = ТЗ.Найти(ИмяРеквизита, "ИмяРеквизита");

	Возврат Стр.СписокВыбора;

КонецФункции // ПолучитьСписокВыбораСвязиПоВладельцу()

// Сохраняет в кэше список выбора для реквизита
//
// Параметры
//  ИмяРеквизита  - Строка - Имя реквизита, для которого нужно
//		сохранить связанный список выбора
//  НовыйСписокВыбора  - СписокЗначений - сохраняемый список значений
//
&НаСервере
Процедура СохранитьСписокВыбораСвязиПоВладельцу(ИмяРеквизита, Знач НовыйСписокВыбора)

	ТЗ = РеквизитФормыВЗначение("СпискиВыбораСвязиПоВладельцу");
	Стр = ТЗ.Найти(ИмяРеквизита, "ИмяРеквизита");
	Стр.СписокВыбора = НовыйСписокВыбора;
	ЗначениеВРеквизитФормы(ТЗ, "СпискиВыбораСвязиПоВладельцу");

КонецПроцедуры // СохранитьСписокВыбораСвязиПоВладельцу()

&НаСервере
Процедура КонтрольЗаполненияСервер()

	СформироватьСтруктуруКолонок();
	КоличествоЭлементов = ТабличныйДокумент.ВысотаТаблицы - Объект.ПерваяСтрокаДанныхТабличногоДокумента + 1;

	КоличествоОшибок = 0;
	Для К = 0 По КоличествоЭлементов - 1 Цикл
		//Состояние("Выполняется контроль заполнения строки № " + (К + 1));
		КонтрольЗаполненияСтроки(ТабличныйДокумент, К + Объект.ПерваяСтрокаДанныхТабличногоДокумента, ,
			КоличествоОшибок);
	КонецЦикла;

	Сообщить("Контроль заполнения завершен. Проверено строк: " + КоличествоЭлементов);
	Если КоличествоОшибок Тогда
		Сообщить("Выявлено ячеек, содержащих ошибки/неоднозначное представление: " + КоличествоОшибок);
	Иначе
		Сообщить("Ячеек, содержащих ошибки не выявлено");
	КонецЕсли;

КонецПроцедуры // КонтрольЗаполненияСервер()

////////////////////////////////////////////////////////////////////////////////
//

// Заполняет настройки колонок по умолчанию или по переданным настройкам
//
// Параметры:
//  Настройки - табличный документ или неопределено
//
&НаСервере
Процедура ЗаполнитьНастройкиКолонок(Настройки)

	ПередЗаписьюОбъекта   = "";
	ПриЗаписиОбъекта      = "";
	ПослеДобавленияСтроки = "";

	Если ТипЗнч(Настройки) = Тип("ТабличныйДокумент") Тогда

		ВерсияОбработки = СокрЛП(Настройки.Область("R1C5").Текст);
		Если ВерсияОбработки = "1.2" Тогда
			ТекущаяСтрока = 11; //Строка с которой начинается таблица реквизитов
		ИначеЕсли ВерсияОбработки = "1.3" Тогда
			ТекущаяСтрока = 11; //Строка с которой начинается таблица реквизитов			
		Иначе
			ВерсияОбработки = "1.1";
			ТекущаяСтрока = 9; //Строка с которой начинается таблица реквизитов
		КонецЕсли;
		Попытка

			ТекстВосстановленногоРежимаЗагрузки = СокрЛП(Настройки.Область(?(ВерсияОбработки = "1.1", "R1", "R2")
				+ "C5").Текст);
			Если ТекстВосстановленногоРежимаЗагрузки = "в справочник" Или ТекстВосстановленногоРежимаЗагрузки = "" Тогда
				ВосстановленныйРежимЗагрузки = 0;
			ИначеЕсли ТекстВосстановленногоРежимаЗагрузки = "в табличную часть" Или ТекстВосстановленногоРежимаЗагрузки
				= "Х" Тогда
				ВосстановленныйРежимЗагрузки = 1;
			ИначеЕсли ТекстВосстановленногоРежимаЗагрузки = "в регистр сведений" Тогда
				ВосстановленныйРежимЗагрузки = 2;
			КонецЕсли;

			МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(Настройки.Область(?(ВерсияОбработки = "1.1", "R2", "R3")
				+ "C5").Текст);
			Если МетаданныеОбъекта = Неопределено Тогда
				ВызватьИсключение "Неправильный формат файла";
			КонецЕсли;

			Если ВосстановленныйРежимЗагрузки = 0 Тогда
				ВосстановленныйСсылкаИсточника = Новый (СтрЗаменить(МетаданныеОбъекта.ПолноеИмя(), ".", "Ссылка."));
			ИначеЕсли ВосстановленныйРежимЗагрузки = 1 Тогда
				ВосстановленныйСсылкаИсточника = Новый (СтрЗаменить(МетаданныеОбъекта.Родитель().ПолноеИмя(), ".",
					"Ссылка."));
			Иначе
				ВосстановленныйСсылкаИсточника = Неопределено;
			КонецЕсли;
			
			//СсылкаИсточника = ПустаяСсылка();
			СтруктураУмолчаний = Новый Структура;
			ТекущаяСтрокаОбласти = "R" + Формат(ТекущаяСтрока, "ЧГ=");
			ИмяРеквизита = Настройки.Область(ТекущаяСтрокаОбласти + "C2").Текст;
			Пока Не ПустаяСтрока(ИмяРеквизита) Цикл
				СтруктураУмолчанияРеквизита = Новый Структура;
				СтруктураУмолчанияРеквизита.Вставить("ИмяРеквизита", ИмяРеквизита);
				СтруктураУмолчанияРеквизита.Вставить("Пометка", Не ПустаяСтрока(Настройки.Область(ТекущаяСтрокаОбласти
					+ "C1").Текст));
				СтруктураУмолчанияРеквизита.Вставить("ПолеПоиска", Не ПустаяСтрока(Настройки.Область(
					ТекущаяСтрокаОбласти + "C3").Текст));

				Типы = Новый Массив;
				ОписаниеТиповСтрокой = Настройки.Область(ТекущаяСтрокаОбласти + "C4").Текст;
				Для к = 1 По СтрЧислоСтрок(ОписаниеТиповСтрокой) Цикл

					кс = Неопределено;
					кч = Неопределено;
					кд = Неопределено;
					МассивЧастейТипа = мРазложитьСтрокуВМассивПодстрок(НРег(СокрЛП(СтрПолучитьСтроку(
						ОписаниеТиповСтрокой, к))), ",");
					Если МассивЧастейТипа.Количество() = 0 Тогда
						Продолжить;
					ИначеЕсли Найти(МассивЧастейТипа[0], ".") Тогда
						Тип = Тип(СтрЗаменить(МассивЧастейТипа[0], ".", "Ссылка."));
					ИначеЕсли МассивЧастейТипа[0] = "строка" Тогда
						Тип = Тип("Строка");
						Если МассивЧастейТипа.Количество() = 2 Тогда
							кс = Новый КвалификаторыСтроки(мПривестиКЧислу(МассивЧастейТипа[1]),
								ДопустимаяДлина.Переменная);
						ИначеЕсли МассивЧастейТипа.Количество() = 3 Тогда
							кс = Новый КвалификаторыСтроки(мПривестиКЧислу(МассивЧастейТипа[1]),
								ДопустимаяДлина.Фиксированная);
						Иначе
							кс = Новый КвалификаторыСтроки;
						КонецЕсли;
					ИначеЕсли МассивЧастейТипа[0] = "число" Тогда
						Тип = Тип("Число");
						кч = Новый КвалификаторыЧисла(мПривестиКЧислу(МассивЧастейТипа[1]), мПривестиКЧислу(
							МассивЧастейТипа[2]), ?(МассивЧастейТипа.Количество() = 4, ДопустимыйЗнак.Неотрицательный,
							ДопустимыйЗнак.Любой));
					ИначеЕсли МассивЧастейТипа[0] = "булево" Тогда
						Тип = Тип("Булево");
					ИначеЕсли МассивЧастейТипа[0] = "дата" Тогда
						Тип = Тип("Дата");
						кд = Новый КвалификаторыДаты(ЧастиДаты.Дата);
					ИначеЕсли МассивЧастейТипа[0] = "время" Тогда
						Тип = Тип("Дата");
						кд = Новый КвалификаторыДаты(ЧастиДаты.Время);
					ИначеЕсли МассивЧастейТипа[0] = "дата и время" Тогда
						Тип = Тип("Дата");
						кд = Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя);
					Иначе
						Продолжить;
					КонецЕсли;
					Типы.Добавить(Тип);
				КонецЦикла;
				ОписаниеТипов = Новый ОписаниеТипов(Типы, кч, кс, кд);
				СтруктураУмолчанияРеквизита.Вставить("ОписаниеТипов", ОписаниеТипов);

				РежимЗагрузкиРеквизита = Настройки.Область(ТекущаяСтрокаОбласти + "C5").Текст;

				СтруктураУмолчанияРеквизита.Вставить("РежимЗагрузки", РежимЗагрузкиРеквизита);

				ЗначениеПоУмолчанию = Настройки.Область(ТекущаяСтрокаОбласти + "C6").Текст;
				СтруктураУмолчанияРеквизита.Вставить("ЗначениеПоУмолчанию", ?(ПустаяСтрока(ЗначениеПоУмолчанию),
					ОписаниеТипов.ПривестиЗначение(Неопределено), ЗначениеИзСтрокиВнутр(ЗначениеПоУмолчанию)));

				Если РежимЗагрузкиРеквизита = "Вычислять" Тогда
					СтруктураУмолчанияРеквизита.Вставить("Выражение", Настройки.Область(ТекущаяСтрокаОбласти
						+ "C7").Текст);
				Иначе
					СтруктураУмолчанияРеквизита.Вставить("ИскатьПо", Настройки.Область(ТекущаяСтрокаОбласти
						+ "C7").Текст);

					СвязьПоВладельцу   = Настройки.Область(ТекущаяСтрокаОбласти + "C8").Текст;
					СтруктураУмолчанияРеквизита.Вставить("СвязьПоВладельцу", ?(Лев(СвязьПоВладельцу, 1) = "{",
						ЗначениеИзСтрокиВнутр(СвязьПоВладельцу), СвязьПоВладельцу));

					СвязьПоТипу        = Настройки.Область(ТекущаяСтрокаОбласти + "C9").Текст;
					СтруктураУмолчанияРеквизита.Вставить("СвязьПоТипу", ?(Лев(СвязьПоТипу, 1) = "{",
						ЗначениеИзСтрокиВнутр(СвязьПоТипу), СвязьПоТипу));

					СтруктураУмолчанияРеквизита.Вставить("ЭлементСвязиПоТипу", мПривестиКЧислу(Настройки.Область(
						ТекущаяСтрокаОбласти + "C10").Текст));
				КонецЕсли;
				Если ВерсияОбработки = "1.3" Тогда
					СтруктураУмолчанияРеквизита.Вставить("НомерКолонки", мПривестиКЧислу(Настройки.Область(
						ТекущаяСтрокаОбласти + "C11").Текст));
				КонецЕсли;

				СтруктураУмолчаний.Вставить(ИмяРеквизита, СтруктураУмолчанияРеквизита);
				ТекущаяСтрока = ТекущаяСтрока + 1;
				ТекущаяСтрокаОбласти = "R" + Формат(ТекущаяСтрока, "ЧГ=");
				ИмяРеквизита = Настройки.Область(ТекущаяСтрокаОбласти + "C2").Текст;

			КонецЦикла;

		Исключение
			мСообщитьОбОшибке(ОписаниеОшибки());
		КонецПопытки;
		
		//МетаданныеИсточника = ПолучитьМетаданныеИсточника();
		//Если МетаданныеИсточника = Неопределено Тогда
		//	Возврат;
		//КонецЕсли;

		Объект.РежимЗагрузки   = ВосстановленныйРежимЗагрузки;
		Если ВосстановленныйРежимЗагрузки = 0 Тогда
			Объект.ТипОбъектаСправочника = МетаданныеОбъекта.Имя;
		ИначеЕсли ВосстановленныйРежимЗагрузки = 1 Тогда
			//Объект.СсылкаИсточника = ВосстановленныйСсылкаИсточника;
			Объект.ТабличнаяЧастьИсточника = ?(ВосстановленныйРежимЗагрузки, МетаданныеОбъекта.Имя, Неопределено);
		ИначеЕсли ВосстановленныйРежимЗагрузки = 2 Тогда
			Объект.ИмяВидаРегистра = МетаданныеОбъекта.Имя;
		КонецЕсли;
		Объект.НеСоздаватьНовыхЭлементов                 = Не ПустаяСтрока(Настройки.Область(?(ВерсияОбработки = "1.1",
			"R3", "R4") + "C5").Текст);
		Объект.ЗамещатьСуществующиеЗаписи = ?(ВерсияОбработки = "1.1", Ложь, Не ПустаяСтрока(Настройки.Область(
			"R5C5").Текст));
		Объект.РучнаяНумерацияКолонокТабличногоДокумента = Не ПустаяСтрока(Настройки.Область(?(ВерсияОбработки = "1.1",
			"R4", "R6") + "C5").Текст);
		Объект.ПерваяСтрокаДанныхТабличногоДокумента     = мПривестиКЧислу(Настройки.Область(?(ВерсияОбработки = "1.1",
			"R5", "R7") + "C5").Текст);

		Объект.ПередЗаписьюОбъекта = Настройки.Область("R" + Формат(ТекущаяСтрока + 2, "ЧГ=") + "C3").Текст;
		Объект.ПриЗаписиОбъекта    = Настройки.Область("R" + Формат(ТекущаяСтрока + 3, "ЧГ=") + "C3").Текст;

		Если Объект.РежимЗагрузки Тогда
			Объект.ПослеДобавленияСтроки = Настройки.Область("R" + Формат(ТекущаяСтрока + 4, "ЧГ=") + "C3").Текст;
		КонецЕсли;

		ТекущаяСтрока = ТекущаяСтрока + 1;

	КонецЕсли;
	Оформление = Неопределено;
	//МетаданныеИсточника = ПолучитьМетаданныеИсточника();

	ТЗ = РеквизитФормыВЗначение("ТаблицаЗагружаемыхРеквизитов");

	ТЗ.Очистить();

	Если Объект.РежимЗагрузки = 0 Тогда
		ЗаполнитьНастройкиКолонокСправочника(ТЗ);
	ИначеЕсли Объект.РежимЗагрузки = 1 Тогда
		ЗаполнитьНастройкиКолонокТабличнойЧасти(ТЗ);
	ИначеЕсли Объект.РежимЗагрузки = 2 Тогда
		ЗаполнитьНастройкиКолонокРегистраСведений(ТЗ);
	КонецЕсли;

	Если Не СтруктураУмолчаний = Неопределено Тогда

		НомерКолонкиОформления = 0;
		НомерКолонки = 1;
		Для Каждого КлючИЗначение Из СтруктураУмолчаний Цикл
			Колонка = КлючИЗначение.Значение;
			ЗагружаемыйРеквизит = ТЗ.Найти(Колонка.ИмяРеквизита, "ИмяРеквизита");
			Если Не ЗагружаемыйРеквизит = Неопределено Тогда
				Индекс = ТЗ.Индекс(ЗагружаемыйРеквизит);
				Если Индекс >= НомерКолонкиОформления Тогда
					ЗаполнитьЗначенияСвойств(ЗагружаемыйРеквизит, Колонка);

					ТЗ.Сдвинуть(ЗагружаемыйРеквизит, НомерКолонкиОформления - Индекс);
					Если Колонка.Пометка И Не ВерсияОбработки = "1.3" Тогда
						ЗагружаемыйРеквизит.НомерКолонки = НомерКолонки;
						НомерКолонки = НомерКолонки + 1;
					КонецЕсли;
					НомерКолонкиОформления = НомерКолонкиОформления + 1;

				КонецЕсли;
			КонецЕсли;

		КонецЦикла;

	Иначе
		НомерКолонки = 1;
		Для Каждого ЗагружаемыйРеквизит Из ТЗ Цикл

			ЗагружаемыйРеквизит.Пометка      = Истина;
			ЗагружаемыйРеквизит.НомерКолонки = НомерКолонки;
			НомерКолонки = НомерКолонки + 1;

		КонецЦикла;

	КонецЕсли;

	Для Каждого ЗагружаемыйРеквизит Из ТЗ Цикл
		Если ЗагружаемыйРеквизит.РежимЗагрузки = "Вычислять" Тогда
			ЗагружаемыйРеквизит.ПредставлениеДопУсловий = ЗагружаемыйРеквизит.Выражение;
		Иначе
			ЗагружаемыйРеквизит.ПредставлениеДопУсловий = ?(ПустаяСтрока(ЗагружаемыйРеквизит.ИскатьПо), "", "Искать по "
				+ ЗагружаемыйРеквизит.ИскатьПо) + ?(ПустаяСтрока(ЗагружаемыйРеквизит.СвязьПоВладельцу), "",
				" по владельцу " + ЗагружаемыйРеквизит.СвязьПоВладельцу);
		КонецЕсли;
	КонецЦикла;

	ЗначениеВРеквизитФормы(ТЗ, "ТаблицаЗагружаемыхРеквизитов");

КонецПроцедуры // ()

// Заполняет настройки колонок по умолчанию для табличной части
//
&НаСервере
Процедура ЗаполнитьНастройкиКолонокТабличнойЧасти(ТЗ)

	МетаданныеИсточника = ПолучитьМетаданныеИсточника();

	Если МетаданныеИсточника = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Для Каждого Реквизит Из МетаданныеИсточника.Реквизиты Цикл
		ЗагружаемыйРеквизит                        = ТЗ.Добавить();
		ЗагружаемыйРеквизит.ИмяРеквизита           = Реквизит.Имя;
		ЗагружаемыйРеквизит.ПредставлениеРеквизита = Реквизит.Представление();
		ЗагружаемыйРеквизит.ОписаниеТипов = МетаданныеИсточника.Реквизиты[ЗагружаемыйРеквизит.ИмяРеквизита].Тип;
	КонецЦикла;

	Для Каждого ЗагружаемыйРеквизит Из ТЗ Цикл

		СписокВыбора = ПолучитьСписокИменПредставлений(ЗагружаемыйРеквизит.ОписаниеТипов);
		ЗагружаемыйРеквизит.ИскатьПо = ?(СписокВыбора.Количество() = 0, "", СписокВыбора[0].Значение);

		СписокВыбора = ПолучитьСписокСвязейПоВладельцу(ЗагружаемыйРеквизит.ОписаниеТипов, ТЗ);
		ЗагружаемыйРеквизит.СвязьПоВладельцу = ?(СписокВыбора.Количество() = 0, "", СписокВыбора[0].Значение);

		СписокВыбора = ПолучитьСписокСвязейПоТипу(ЗагружаемыйРеквизит, ТЗ);
		Если СписокВыбора.Количество() = 0 Тогда
			ЗагружаемыйРеквизит.СвязьПоТипу = "";
			ЗагружаемыйРеквизит.ЭлементСвязиПоТипу = 0;
		Иначе
			ЗагружаемыйРеквизит.СвязьПоТипу = СписокВыбора[0].Значение;
			Если Найти(ЗагружаемыйРеквизит.ИмяРеквизита, "3") <> 0 Тогда

				ЗагружаемыйРеквизит.ЭлементСвязиПоТипу = 3;

			ИначеЕсли Найти(ЗагружаемыйРеквизит.ИмяРеквизита, "2") <> 0 Тогда

				ЗагружаемыйРеквизит.ЭлементСвязиПоТипу = 2;

			Иначе

				ЗагружаемыйРеквизит.ЭлементСвязиПоТипу = 1;

			КонецЕсли;

		КонецЕсли;

		ЗагружаемыйРеквизит.ЗначениеПоУмолчанию = ЗагружаемыйРеквизит.ОписаниеТипов.ПривестиЗначение(Неопределено);
		ЗагружаемыйРеквизит.ДоступныеТипы = ЗагружаемыйРеквизит.ОписаниеТипов;
		ЗагружаемыйРеквизит.РежимЗагрузки = "Искать";
	КонецЦикла;

КонецПроцедуры // ()

// Заполняет настройки колонок по умолчанию для справочника
//
&НаСервере
Процедура ЗаполнитьНастройкиКолонокСправочника(ТЗ)

	МетаданныеИсточника = ПолучитьМетаданныеИсточника();

	Если МетаданныеИсточника = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если МетаданныеИсточника.ДлинаКода > 0 Тогда

		ЗагружаемыйРеквизит = ТЗ.Добавить();
		ЗагружаемыйРеквизит.ИмяРеквизита           = "Код";
		ЗагружаемыйРеквизит.ПредставлениеРеквизита = "Код";
		ЗагружаемыйРеквизит.МожетБытьПолемПоиска   =  Истина;

		Если МетаданныеИсточника.ТипКода = Метаданные.СвойстваОбъектов.ТипКодаСправочника.Строка Тогда
			ЗагружаемыйРеквизит.ОписаниеТипов = Новый ОписаниеТипов("Строка", ,
				Новый КвалификаторыСтроки(МетаданныеИсточника.ДлинаКода));
		Иначе
			ЗагружаемыйРеквизит.ОписаниеТипов = Новый ОписаниеТипов("Число", , ,
				Новый КвалификаторыЧисла(МетаданныеИсточника.ДлинаКода));
		КонецЕсли;

	КонецЕсли;

	Если МетаданныеИсточника.ДлинаНаименования > 0 Тогда

		ЗагружаемыйРеквизит = ТЗ.Добавить();
		ЗагружаемыйРеквизит.ИмяРеквизита           = "Наименование";
		ЗагружаемыйРеквизит.ПредставлениеРеквизита = "Наименование";
		ЗагружаемыйРеквизит.МожетБытьПолемПоиска   =  Истина;
		ЗагружаемыйРеквизит.ОписаниеТипов = Новый ОписаниеТипов("Строка", ,
			Новый КвалификаторыСтроки(МетаданныеИсточника.ДлинаНаименования));

	КонецЕсли;

	Если МетаданныеИсточника.Владельцы.Количество() > 0 Тогда

		ЗагружаемыйРеквизит = ТЗ.Добавить();
		ЗагружаемыйРеквизит.ИмяРеквизита           = "Владелец";
		ЗагружаемыйРеквизит.ПредставлениеРеквизита = "Владелец";
		ЗагружаемыйРеквизит.МожетБытьПолемПоиска   =  Истина;

		СтрокаОписанияТипов = "";

		Для Каждого Владелец Из МетаданныеИсточника.Владельцы Цикл
			СтрокаОписанияТипов = ?(ПустаяСтрока(СтрокаОписанияТипов), "", СтрокаОписанияТипов + ", ")
				+ Владелец.ПолноеИмя();
		КонецЦикла;

		СтрокаОписанияТипов = СтрЗаменить(СтрокаОписанияТипов, ".", "Ссылка.");
		ЗагружаемыйРеквизит.ОписаниеТипов = Новый ОписаниеТипов(СтрокаОписанияТипов);

	КонецЕсли;

	Если МетаданныеИсточника.Иерархический Тогда

		ЗагружаемыйРеквизит = ТЗ.Добавить();
		ЗагружаемыйРеквизит.ИмяРеквизита           = "Родитель";
		ЗагружаемыйРеквизит.ПредставлениеРеквизита = "Родитель";
		ЗагружаемыйРеквизит.МожетБытьПолемПоиска   = Истина;
		ЗагружаемыйРеквизит.ОписаниеТипов = Новый ОписаниеТипов(СтрЗаменить(МетаданныеИсточника.ПолноеИмя(), ".",
			"Ссылка."));
		
		Если МетаданныеИсточника.ВидИерархии = Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияГруппИЭлементов Тогда
			ЗагружаемыйРеквизит = ТЗ.Добавить();
			ЗагружаемыйРеквизит.ИмяРеквизита           = "ЭтоГруппа";
			ЗагружаемыйРеквизит.ПредставлениеРеквизита = "ЭтоГруппа";
			ЗагружаемыйРеквизит.МожетБытьПолемПоиска   = Истина;
			ЗагружаемыйРеквизит.ОписаниеТипов = Новый ОписаниеТипов("Булево");
		КонецЕсли; 

	КонецЕсли;

	Для Каждого Реквизит Из МетаданныеИсточника.Реквизиты Цикл
		Если Не Реквизит.Использование = Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляГруппы Тогда
			ЗагружаемыйРеквизит                        = ТЗ.Добавить();
			ЗагружаемыйРеквизит.ИмяРеквизита           = Реквизит.Имя;
			ЗагружаемыйРеквизит.ПредставлениеРеквизита = Реквизит.Представление();
			ЗагружаемыйРеквизит.МожетБытьПолемПоиска   = Не Реквизит.Индексирование
				= Метаданные.СвойстваОбъектов.Индексирование.НеИндексировать;
			ЗагружаемыйРеквизит.ОписаниеТипов = МетаданныеИсточника.Реквизиты[ЗагружаемыйРеквизит.ИмяРеквизита].Тип;
		КонецЕсли;
	КонецЦикла;

	Для Каждого ЗагружаемыйРеквизит Из ТЗ Цикл

		СписокВыбора = ПолучитьСписокИменПредставлений(ЗагружаемыйРеквизит.ОписаниеТипов);
		ЗагружаемыйРеквизит.ИскатьПо = ?(СписокВыбора.Количество() = 0, "", СписокВыбора[0].Значение);

		СписокВыбора = ПолучитьСписокСвязейПоВладельцу(ЗагружаемыйРеквизит.ОписаниеТипов, ТЗ);
		ЗагружаемыйРеквизит.СвязьПоВладельцу = ?(СписокВыбора.Количество() = 0, "", СписокВыбора[0].Значение);

		СписокВыбора = ПолучитьСписокСвязейПоТипу(ЗагружаемыйРеквизит, ТЗ);
		Если СписокВыбора.Количество() = 0 Тогда
			ЗагружаемыйРеквизит.СвязьПоТипу = "";
			ЗагружаемыйРеквизит.ЭлементСвязиПоТипу = 0;
		Иначе
			ЗагружаемыйРеквизит.СвязьПоТипу = СписокВыбора[0].Значение;
			Если Найти(ЗагружаемыйРеквизит.ИмяРеквизита, "3") <> 0 Тогда

				ЗагружаемыйРеквизит.ЭлементСвязиПоТипу = 3;

			ИначеЕсли Найти(ЗагружаемыйРеквизит.ИмяРеквизита, "2") <> 0 Тогда

				ЗагружаемыйРеквизит.ЭлементСвязиПоТипу = 2;

			Иначе

				ЗагружаемыйРеквизит.ЭлементСвязиПоТипу = 1;

			КонецЕсли;
		КонецЕсли;

		ЗагружаемыйРеквизит.ЗначениеПоУмолчанию = ЗагружаемыйРеквизит.ОписаниеТипов.ПривестиЗначение(Неопределено);
		ЗагружаемыйРеквизит.ДоступныеТипы = ЗагружаемыйРеквизит.ОписаниеТипов;
		ЗагружаемыйРеквизит.РежимЗагрузки = "Искать";
	КонецЦикла;
КонецПроцедуры // ()

// Заполняет настройки колонок по умолчанию для регистра сведений
//
&НаСервере
Процедура ЗаполнитьНастройкиКолонокРегистраСведений(ТЗ)

	МетаданныеИсточника = ПолучитьМетаданныеИсточника();

	Если МетаданныеИсточника = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если Не МетаданныеИсточника.ПериодичностьРегистраСведений
		= Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический Тогда

		ЗагружаемыйРеквизит = ТЗ.Добавить();
		ЗагружаемыйРеквизит.ИмяРеквизита           = "Период";
		ЗагружаемыйРеквизит.ПредставлениеРеквизита = "Период";
		ЗагружаемыйРеквизит.МожетБытьПолемПоиска = Истина;
		ЗагружаемыйРеквизит.ПолеПоиска           = Истина;

		ЗагружаемыйРеквизит.ОписаниеТипов = Новый ОписаниеТипов("Дата", , , ,
			Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя));

	КонецЕсли;

	Для Каждого Реквизит Из МетаданныеИсточника.Измерения Цикл
		ЗагружаемыйРеквизит                        = ТЗ.Добавить();
		ЗагружаемыйРеквизит.МожетБытьПолемПоиска = Истина;
		ЗагружаемыйРеквизит.ИмяРеквизита           = Реквизит.Имя;
		ЗагружаемыйРеквизит.ПредставлениеРеквизита = Реквизит.Представление();
		ЗагружаемыйРеквизит.ОписаниеТипов = МетаданныеИсточника.Измерения[ЗагружаемыйРеквизит.ИмяРеквизита].Тип;
	КонецЦикла;

	Для Каждого Реквизит Из МетаданныеИсточника.Ресурсы Цикл
		ЗагружаемыйРеквизит                        = ТЗ.Добавить();
		ЗагружаемыйРеквизит.ИмяРеквизита           = Реквизит.Имя;
		ЗагружаемыйРеквизит.ПредставлениеРеквизита = Реквизит.Представление();
		ЗагружаемыйРеквизит.ОписаниеТипов = МетаданныеИсточника.Ресурсы[ЗагружаемыйРеквизит.ИмяРеквизита].Тип;
	КонецЦикла;

	Для Каждого Реквизит Из МетаданныеИсточника.Реквизиты Цикл
		ЗагружаемыйРеквизит                        = ТЗ.Добавить();
		ЗагружаемыйРеквизит.ИмяРеквизита           = Реквизит.Имя;
		ЗагружаемыйРеквизит.ПредставлениеРеквизита = Реквизит.Представление();
		ЗагружаемыйРеквизит.ОписаниеТипов = МетаданныеИсточника.Реквизиты[ЗагружаемыйРеквизит.ИмяРеквизита].Тип;
	КонецЦикла;

	Для Каждого ЗагружаемыйРеквизит Из ТЗ Цикл

		СписокВыбора = ПолучитьСписокИменПредставлений(ЗагружаемыйРеквизит.ОписаниеТипов);
		ЗагружаемыйРеквизит.ИскатьПо = ?(СписокВыбора.Количество() = 0, "", СписокВыбора[0].Значение);

		СписокВыбора = ПолучитьСписокСвязейПоВладельцу(ЗагружаемыйРеквизит.ОписаниеТипов, ТЗ);
		ЗагружаемыйРеквизит.СвязьПоВладельцу = ?(СписокВыбора.Количество() = 0, "", СписокВыбора[0].Значение);

		СписокВыбора = ПолучитьСписокСвязейПоТипу(ЗагружаемыйРеквизит, ТЗ);
		Если СписокВыбора.Количество() = 0 Тогда
			ЗагружаемыйРеквизит.СвязьПоТипу = "";
			ЗагружаемыйРеквизит.ЭлементСвязиПоТипу = 0;
		Иначе
			ЗагружаемыйРеквизит.СвязьПоТипу = СписокВыбора[0].Значение;
			Если Найти(ЗагружаемыйРеквизит.ИмяРеквизита, "3") <> 0 Тогда

				ЗагружаемыйРеквизит.ЭлементСвязиПоТипу = 3;

			ИначеЕсли Найти(ЗагружаемыйРеквизит.ИмяРеквизита, "2") <> 0 Тогда

				ЗагружаемыйРеквизит.ЭлементСвязиПоТипу = 2;

			Иначе

				ЗагружаемыйРеквизит.ЭлементСвязиПоТипу = 1;

			КонецЕсли;
		КонецЕсли;

		ЗагружаемыйРеквизит.ЗначениеПоУмолчанию = ЗагружаемыйРеквизит.ОписаниеТипов.ПривестиЗначение(Неопределено);
		ЗагружаемыйРеквизит.ДоступныеТипы = ЗагружаемыйРеквизит.ОписаниеТипов;
		ЗагружаемыйРеквизит.РежимЗагрузки = "Искать";
	КонецЦикла;
КонецПроцедуры // ()

// Функция формирует табличный документ с настройками обработки
&НаСервере
Функция ПолучитьНастройки()

	МетаданныеОбъекта = ПолучитьМетаданныеИсточника();

	Если МетаданныеОбъекта = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;

	ВидОбъекта     = МетаданныеОбъекта.ПолноеИмя();

	ДокументРезультат = Новый ТабличныйДокумент;
	ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
	Макет = ОбработкаОбъект.ПолучитьМакетОбработки("МакетСохраненияНастроек");

	ОбластьШапки = Макет.ПолучитьОбласть("Шапка");
	Если Объект.РежимЗагрузки = 0 Тогда
		ОбластьШапки.Параметры.РежимЗагрузки = "в справочник";
	ИначеЕсли Объект.РежимЗагрузки = 1 Тогда
		ОбластьШапки.Параметры.РежимЗагрузки = "в табличную часть";
	ИначеЕсли Объект.РежимЗагрузки = 2 Тогда
		ОбластьШапки.Параметры.РежимЗагрузки = "в регистр сведений";
	КонецЕсли;

	ОбластьШапки.Параметры.ВидОбъекта                                = ВидОбъекта;
	ОбластьШапки.Параметры.НеСоздаватьНовыхЭлементов                 = ?(Объект.НеСоздаватьНовыхЭлементов, "Х", "");
	ОбластьШапки.Параметры.ЗамещатьСуществующиеЗаписи                 = ?(Объект.ЗамещатьСуществующиеЗаписи, "Х", "");
	ОбластьШапки.Параметры.РучнаяНумерацияКолонокТабличногоДокумента = ?(
		Объект.РучнаяНумерацияКолонокТабличногоДокумента, "Х", "");
	ОбластьШапки.Параметры.ПерваяСтрокаДанныхТабличногоДокумента     = Объект.ПерваяСтрокаДанныхТабличногоДокумента;

	ДокументРезультат.Вывести(ОбластьШапки);

	ТЗ = РеквизитФормыВЗначение("ТаблицаЗагружаемыхРеквизитов");

	Для Каждого ЗагружаемыйРеквизит Из ТЗ Цикл
		ОбластьСтроки = Макет.ПолучитьОбласть("Строка" + ?(ЗагружаемыйРеквизит.РежимЗагрузки = "Вычислять", "Выражение",
			""));

		ОбластьСтроки.Параметры.Пометка      = ?(ЗагружаемыйРеквизит.Пометка, "Х", "");
		ОбластьСтроки.Параметры.ИмяРеквизита = ЗагружаемыйРеквизит.ИмяРеквизита;
		ОбластьСтроки.Параметры.ПолеПоиска   = ?(ЗагружаемыйРеквизит.ПолеПоиска, "Х", "");

		ОбластьСтроки.Параметры.ОписаниеТипов       = ПолучитьОписаниеТипа(ЗагружаемыйРеквизит.ОписаниеТипов);

		ОбластьСтроки.Параметры.РежимЗагрузки       = ЗагружаемыйРеквизит.РежимЗагрузки;
		Если ЗагружаемыйРеквизит.ОписаниеТипов.ПривестиЗначение(Неопределено) = ЗагружаемыйРеквизит.ЗначениеПоУмолчанию Тогда
			ОбластьСтроки.Параметры.ЗначениеПоУмолчанию = "";
		Иначе
			ОбластьСтроки.Параметры.ЗначениеПоУмолчанию = ЗначениеВСтрокуВнутр(ЗагружаемыйРеквизит.ЗначениеПоУмолчанию);
		КонецЕсли;

		Если ЗагружаемыйРеквизит.РежимЗагрузки = "Вычислять" Тогда

			ОбластьСтроки.Параметры.Выражение           = ЗагружаемыйРеквизит.Выражение;

		Иначе
			ОбластьСтроки.Параметры.ИскатьПо            = ЗагружаемыйРеквизит.ИскатьПо;
			ОбластьСтроки.Параметры.СвязьПоВладельцу    = ?(ТипЗнч(ЗагружаемыйРеквизит.СвязьПоВладельцу) = Тип(
				"Строка"), ЗагружаемыйРеквизит.СвязьПоВладельцу, ЗначениеВСтрокуВнутр(
				ЗагружаемыйРеквизит.СвязьПоВладельцу));
			ОбластьСтроки.Параметры.СвязьПоТипу         = ?(ТипЗнч(ЗагружаемыйРеквизит.СвязьПоТипу) = Тип("Строка"),
				ЗагружаемыйРеквизит.СвязьПоТипу, ЗначениеВСтрокуВнутр(ЗагружаемыйРеквизит.СвязьПоТипу));
			ОбластьСтроки.Параметры.ЭлементСвязиПоТипу  = ЗагружаемыйРеквизит.ЭлементСвязиПоТипу;
		КонецЕсли;
		// Добавлен параметр НомерКолонки
		ОбластьСтроки.Параметры.НомерКолонки			= ЗагружаемыйРеквизит.НомерКолонки;

		ДокументРезультат.Вывести(ОбластьСтроки);

	КонецЦикла;

	ОбластьПодвала = Макет.ПолучитьОбласть("События");
	ОбластьПодвала.Параметры.ПередЗаписьюОбъекта = Объект.ПередЗаписьюОбъекта;
	ОбластьПодвала.Параметры.ПриЗаписиОбъекта = Объект.ПриЗаписиОбъекта;
	ДокументРезультат.Вывести(ОбластьПодвала);
	Если Объект.РежимЗагрузки Тогда

		ОбластьПодвала = Макет.ПолучитьОбласть("СобытияПослеДобавленияСтроки");
		ОбластьПодвала.Параметры.ПослеДобавленияСтроки = Объект.ПослеДобавленияСтроки;
		ДокументРезультат.Вывести(ОбластьПодвала);

	КонецЕсли;

	Возврат ДокументРезультат;

КонецФункции

// Функция читает mxl-файл с настройками обработки
&НаСервере
Функция ПрочитатьНастройкиНаСервере(АдресХранилища)

	Данные = ПолучитьИзВременногоХранилища(АдресХранилища);

	ИмяФайлаВременное = ПолучитьИмяВременногоФайла("mxl");
	ВремДок = Новый ТабличныйДокумент;
	Данные.Записать(ИмяФайлаВременное);
	ВремДок.Прочитать(ИмяФайлаВременное);
	УдалитьФайлы(ИмяФайлаВременное);

	Возврат ВремДок;
КонецФункции

// Функция возвращает содержимое mxl-файла с настройками обработки
&НаКлиенте
Функция мПрочитатьНастройкиИзФайла(ИмяФайла)

	ДанныеФайла = Новый ДвоичныеДанные(ИмяФайла);

	АдресФайла = "";
	АдресФайла = ПоместитьВоВременноеХранилище(ДанныеФайла, ЭтаФорма.УникальныйИдентификатор);

	Возврат ПрочитатьНастройкиНаСервере(АдресФайла);

КонецФункции

&НаСервере
Процедура СкопироватьНастройки(Знач Источник, Приемник)
	
	//Если ТипЗнч(Источник) = Тип("ДанныеФормыКоллекция") Тогда
	//	Источник = ДанныеФормыВЗначение(Источник, Тип("ТаблицаЗначений"));
	//Иначе
	Если Не ТипЗнч(Источник) = Тип("ТаблицаЗначений") Тогда
		Возврат;
	КонецЕсли;

	Приемник.Очистить();

	Для Каждого Стр Из Источник Цикл
		НовСтр = Приемник.Добавить();
		ЗаполнитьЗначенияСвойств(НовСтр, Стр);
	КонецЦикла;

КонецПроцедуры

&НаСервере
Процедура ПриЗакрытииНаСервере()

	мСохранитьЗначение("РежимЗагрузки", Объект.РежимЗагрузки);
	мСохранитьЗначение("СсылкаИсточника", Объект.СсылкаИсточника);
	мСохранитьЗначение("ТабличнаяЧастьИсточника", Объект.ТабличнаяЧастьИсточника);
	мСохранитьЗначение("ИмяВидаРегистра", Объект.ИмяВидаРегистра);
	мСохранитьЗначение("ТипОбъектаСправочника", Объект.ТипОбъектаСправочника);

КонецПроцедуры // ПриЗакрытииНаСервере()

////////////////////////////////////////////////////////////////////////////////
//

&НаСервере
Процедура ОбновитьДанныеТабличногоДокументаСервер()

	ТабличныйДокумент.Очистить();

	СформироватьСтруктуруКолонок();
	СформироватьШапкуТабличногоДокумента(ТабличныйДокумент);

	НомерСтроки = Объект.ПерваяСтрокаДанныхТабличногоДокумента;

	МетаданныеИсточника = ПолучитьМетаданныеИсточника();
	Если Объект.РежимЗагрузки = 0 Или Объект.РежимЗагрузки = 2 Или МетаданныеИсточника = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Источник = Объект.СсылкаИсточника[Объект.ТабличнаяЧастьИсточника];
	
	//ТЗ = РеквизитФормыВЗначение("ТаблицаЗагружаемыхРеквизитов");

	Для Каждого Строка Из Источник Цикл

		НомерКолонки = 0;

		Для Каждого ЗагружаемыйРеквизит Из ТаблицаЗагружаемыхРеквизитов Цикл

			Если ЗагружаемыйРеквизит.Пометка Тогда

				Если Объект.РучнаяНумерацияКолонокТабличногоДокумента Тогда
					НомерКолонки = ЗагружаемыйРеквизит.НомерКолонки;
				Иначе
					НомерКолонки = НомерКолонки + 1;
				КонецЕсли;

				Область = ТабличныйДокумент.Область("R" + Формат(НомерСтроки, "ЧГ=") + "C" + НомерКолонки);
				Значение = Строка[ЗагружаемыйРеквизит.ИмяРеквизита];

				Попытка
					Представление = Значение[ЗагружаемыйРеквизит.ИскатьПо];

				Исключение

					Представление = Значение;

				КонецПопытки;

				Область.Текст = Представление;
				Область.Расшифровка = Значение;

			КонецЕсли;

		КонецЦикла;

		НомерСтроки = НомерСтроки + 1;
	КонецЦикла;

КонецПроцедуры // ОбновитьДанныеТабличногоДокументаСервер()

&НаКлиенте
Процедура ОбновитьДанныеТабличногоДокумента(Знач Оповещение, БезВопросов = Ложь)

	Если (Объект.РежимЗагрузки = 0 Или Объект.РежимЗагрузки = 2) И Элементы.ТабДокумент.Высота > 1 И Не БезВопросов Тогда
		ПоказатьВопрос(Новый ОписаниеОповещения("ОбновитьДанныеТабличногоДокументаЗавершение", ЭтаФорма,
			Новый Структура("Оповещение", Оповещение)), "Табличный документ содержит данные. Очистить?",
			РежимДиалогаВопрос.ДаНет);
		Возврат;
	Иначе
		ОбновитьДанныеТабличногоДокументаСервер();
	КонецЕсли;

	ОбновитьДанныеТабличногоДокументаФрагмент(Оповещение);
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьДанныеТабличногоДокументаЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт

	Оповещение = ДополнительныеПараметры.Оповещение;
	Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
		ОбновитьДанныеТабличногоДокументаСервер();
		ВыполнитьОбработкуОповещения(Оповещение);
		Возврат;
	КонецЕсли;

	ОбновитьДанныеТабличногоДокументаФрагмент(Оповещение);

КонецПроцедуры

&НаКлиенте
Процедура ОбновитьДанныеТабличногоДокументаФрагмент(Знач Оповещение)

	ВыполнитьОбработкуОповещения(Оповещение);

КонецПроцедуры

// Функция считывает в табличный документ данные из файла в формате Excel
//
// Параметры:
//  ТабличныйДокумент  - ТабличныйДокумент, в который необходимо прочитать данные
//  ИмяФайла           - имя файла в формате Excel, из которого необходимо прочитать данные
//  НомерЛистаExcel    - номер листа книги Excel, из которого необходимо прочитать данные
//
// Возвращаемое значение:
//  Истина, если файл прочитан, Ложь - иначе
//
&НаКлиенте
Процедура мПрочитатьТабличныйДокументИзExcel(ИмяФайла, НомерЛистаExcel = 1) Экспорт

	НачатьПроверкуСуществованияФайла(ИмяФайла,
		Новый ОписаниеОповещения("мПрочитатьТабличныйДокументИзExcelЗаверешениеПроверкиСуществованияФайла", ЭтотОбъект,
		Новый Структура("ИмяФайла,НомерЛистаExcel", ИмяФайла, НомерЛистаExcel)));

КонецПроцедуры // ()

&НаКлиенте
Процедура мПрочитатьТабличныйДокументИзExcelЗаверешениеПроверкиСуществованияФайла(Существует, ДополнительныеПараметры) Экспорт
	Если Не Существует Тогда
		Сообщить("Файл не существует!");
		Возврат;
	КонецЕсли;
	НомерЛистаExcel=ДополнительныеПараметры.НомерЛистаExcel;
	ИмяФайла=ДополнительныеПараметры.ИмяФайла;

	xlLastCell = 11;
	Попытка
		Excel = Новый COMОбъект("Excel.Application");
		Excel.WorkBooks.Open(ИмяФайла);
		Сообщить("Обработка файла Microsoft Excel...");
		ExcelЛист = Excel.Sheets(НомерЛистаExcel);
	Исключение
		Сообщить("Ошибка. Возможно неверно указан номер листа книги Excel.");
		Возврат;

	КонецПопытки;

	ТабличныйДокумент = Новый ТабличныйДокумент;

	ActiveCell = Excel.ActiveCell.SpecialCells(xlLastCell);
	RowCount = ActiveCell.Row;
	ColumnCount = ActiveCell.Column;
	Для Column = 1 По ColumnCount Цикл
		ТабличныйДокумент.Область("C" + Формат(Column, "ЧГ=")).ШиринаКолонки = ExcelЛист.Columns(Column).ColumnWidth;
	КонецЦикла;
	Для Row = 1 По RowCount Цикл

		Для Column = 1 По ColumnCount Цикл
			ТабличныйДокумент.Область("R" + Формат(Row, "ЧГ=") + "C" + Формат(Column, "ЧГ=")).Текст = ExcelЛист.Cells(
				Row, Column).Text;
		КонецЦикла;

	КонецЦикла;

	Excel.WorkBooks.Close();
	Excel = 0;
КонецПроцедуры

// Функция считывает в табличный документ данные из файла в формате TXT
//
// Параметры:
//  ТабличныйДокумент  - ТабличныйДокумент, в который необходимо прочитать данные
//  ИмяФайла           - имя файла в формате TXT, из которого необходимо прочитать данные
//
// Возвращаемое значение:
//  Истина, если файл прочитан, Ложь - иначе
//
&НаКлиенте
Процедура мПрочитатьТабличныйДокументИзТекста(ИмяФайла) Экспорт

	ВыбФайл = Новый Файл(ИмяФайла);
	ВыбФайл.НачатьПроверкуСуществования(
		Новый ОписаниеОповещения("мПрочитатьТабличныйДокументИзТекстаЗавершениеПроверкиСуществованияФайла", ЭтаФорма,
		Новый Структура("ИмяФайла", ИмяФайла)));

КонецПроцедуры

&НаКлиенте
Процедура мПрочитатьТабличныйДокументИзТекстаЗавершениеПроверкиСуществованияФайла(Существует, ДополнительныеПараметры) Экспорт

	ИмяФайла = ДополнительныеПараметры.ИмяФайла;
	Если Существует Тогда
		ТекстовыйДокумент = Новый ТекстовыйДокумент;
		ТекстовыйДокумент.НачатьЧтение(Новый ОписаниеОповещения("мПрочитатьТабличныйДокументИзТекстаЗавершение",
			ЭтотОбъект, Новый Структура("ТекстовыйДокумент", ТекстовыйДокумент),
			"мПрочитатьТабличныйДокументИзТекстаЗавершениеОшибкаЧтения", ЭтотОбъект), ИмяФайла);

	Иначе
		Сообщить("Файл не существует!");

	КонецЕсли;

КонецПроцедуры // ()

&НаКлиенте
Процедура мПрочитатьТабличныйДокументИзТекстаЗавершение(ДополнительныеПараметры) Экспорт
	ТекстовыйДокумент=ДополнительныеПараметры.ТекстовыйДокумент;

	ТабличныйДокумент = Новый ТабличныйДокумент;
	Для ТекущаяСтрока = 1 По ТекстовыйДокумент.КоличествоСтрок() Цикл
		ТекущаяКолонка = 0;
		Для Каждого Значение Из мРазложитьСтрокуВМассивПодстрок(ТекстовыйДокумент.ПолучитьСтроку(ТекущаяСтрока),
			Символы.Таб) Цикл
			ТекущаяКолонка = ТекущаяКолонка + 1;
			ТабличныйДокумент.Область("R" + Формат(ТекущаяСтрока, "ЧГ=") + "C" + Формат(ТекущаяКолонка,
				"ЧГ=")).Текст = Значение;

		КонецЦикла;

	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура мПрочитатьТабличныйДокументИзТекстаЗавершениеОшибкаЧтения(ИнформацияОбОшибке, СтандартнаяОбработка,
	ДополнительныеПараметры) Экспорт
	СтандартнаяОбработка=Ложь;
	Сообщить("Ошибка открытия файла!");
КонецПроцедуры

&НаКлиенте
Процедура НачатьПроверкуСуществованияФайла(ИмяФайла, ОписаниеОповещенияОЗавершении)
	ВыбФайл = Новый Файл(ИмяФайла);
	ВыбФайл.НачатьПроверкуСуществования(ОписаниеОповещенияОЗавершении);
КонецПроцедуры

// Функция считывает в табличный документ данные из файла в формате dBase III (*.dbf)
//
// Параметры:
//  ТабличныйДокумент  - ТабличныйДокумент, в который необходимо прочитать данные
//  ИмяФайла           - имя файла в формате TXT, из которого необходимо прочитать данные
//
// Возвращаемое значение:
//  Истина, если файл прочитан, Ложь - иначе
//
&НаКлиенте
Процедура мПрочитатьТабличныйДокументИзDBF(ИмяФайла) Экспорт
	НачатьПроверкуСуществованияФайла(ИмяФайла,
		Новый ОписаниеОповещения("мПрочитатьТабличныйДокументИзDBFЗавершениеПроверкиСуществованияФайла", ЭтотОбъект,
		Новый Структура("ИмяФайла", ИмяФайла)));
КонецПроцедуры // ()

&НаКлиенте
Процедура мПрочитатьТабличныйДокументИзDBFЗавершениеПроверкиСуществованияФайла(Существует, ДополнительныеПараметры) Экспорт
	Если Не Существует Тогда
		Сообщить("Файл не существует!");
		Возврат;
	КонецЕсли;

#Если Не ВебКлиент Тогда

	ИмяФайла=ДополнительныеПараметры.ИмяФайла;

	XBase  = Новый XBase;
	XBase.Кодировка = ПредопределенноеЗначение("КодировкаXBase.OEM");
	Попытка
		XBase.ОткрытьФайл(ИмяФайла);
	Исключение
		Сообщить("Ошибка открытия файла!");
		Возврат;
	КонецПопытки;

	ТабличныйДокумент = Новый ТабличныйДокумент;
	ТекущаяСтрока = 1;
	ТекущаяКолонка = 0;
	Для Каждого Поле Из XBase.поля Цикл
		ТекущаяКолонка = ТекущаяКолонка + 1;
		ТабличныйДокумент.Область("R" + Формат(ТекущаяСтрока, "ЧГ=") + "C" + Формат(ТекущаяКолонка,
			"ЧГ=")).Текст = Поле.Имя;
	КонецЦикла;
	Рез = XBase.Первая();
	Пока Не XBase.ВКонце() Цикл
		ТекущаяСтрока = ТекущаяСтрока + 1;

		ТекущаяКолонка = 0;
		Для Каждого Поле Из XBase.поля Цикл
			ТекущаяКолонка = ТекущаяКолонка + 1;
			ТабличныйДокумент.Область("R" + Формат(ТекущаяСтрока, "ЧГ=") + "C" + Формат(ТекущаяКолонка,
				"ЧГ=")).Текст = XBase.ПолучитьЗначениеПоля(ТекущаяКолонка - 1);
		КонецЦикла;

		XBase.Следующая();
	КонецЦикла;
#Иначе
		ПоказатьПредупреждение(Неопределено, "Чтение DBF файлов недоступно в веб клиенте");
#КонецЕсли

КонецПроцедуры

&НаСервере
Процедура ПрочитатьТабличныйДокументИзMXLНаСервере(АдресХранилища)

	Данные = ПолучитьИзВременногоХранилища(АдресХранилища);

	ИмяФайлаВременное = ПолучитьИмяВременногоФайла("mxl");

	Данные.Записать(ИмяФайлаВременное);
	ТабличныйДокумент.Прочитать(ИмяФайлаВременное);
	УдалитьФайлы(ИмяФайлаВременное);

КонецПроцедуры // ПрочитатьТабличныйДокументИзMXLНаСервере()

&НаКлиенте
Процедура мПрочитатьТабличныйДокументИзMXL(ИмяФайла)

	ДанныеФайла = Новый ДвоичныеДанные(ИмяФайла);

	АдресФайла = "";
	АдресФайла = ПоместитьВоВременноеХранилище(ДанныеФайла, ЭтаФорма.УникальныйИдентификатор);

	ПрочитатьТабличныйДокументИзMXLНаСервере(АдресФайла);

КонецПроцедуры // ()

////////////////////////////////////////////////////////////////////////////////
//

&НаКлиенте
Процедура УправлениеВидимостью()

	РежимЗагрузки = Объект.РежимЗагрузки;
	РучнаяНумерацияКолонокТабличногоДокумента = Объект.РучнаяНумерацияКолонокТабличногоДокумента;

	Если РежимЗагрузки = 0 Тогда
		ТекЭлемент = Элементы.ГруппаЗагрузкаВСправочник;
	ИначеЕсли РежимЗагрузки = 1 Тогда
		ТекЭлемент = Элементы.ГруппаЗагрузкаВТабличнуюЧасть;
	ИначеЕсли РежимЗагрузки = 2 Тогда
		ТекЭлемент = Элементы.ГруппаЗагрузкаВРегистрСведений;
	Иначе
		Возврат; // Неизвестный режим
	КонецЕсли;
	Если Не Элементы.ГруппаПанельРежима.ТекущаяСтраница = ТекЭлемент Тогда
		Элементы.ГруппаПанельРежима.ТекущаяСтраница = ТекЭлемент;
	КонецЕсли;

	Элементы.ТаблицаЗагружаемыхРеквизитовПолеПоиска.Видимость         = РежимЗагрузки = 0;

	Элементы.НеСоздаватьНовыхЭлементов.Видимость = РежимЗагрузки = 0;
	Элементы.ЗамещатьСуществующиеЗаписи.Видимость = РежимЗагрузки = 2;

	ДоступностьКнопкиСохранитьЗначения    = ЕстьВыбранныеМетаданные();
	ДоступностьКнопкиВосстановитьЗначения = Ложь; //Не СписокСохраненныхНастроек.Количество() = 0;

	Элементы.СохранитьЗначения.Доступность = Ложь; //ДоступностьКнопкиСохранитьЗначения;
	Элементы.ВосстановитьЗначения.Доступность = ДоступностьКнопкиВосстановитьЗначения;

	Элементы.СохранитьЗначенияВФайл.Доступность = ДоступностьКнопкиСохранитьЗначения;

	Элементы.ТаблицаЗагружаемыхРеквизитовНомерКолонки.Видимость = РучнаяНумерацияКолонокТабличногоДокумента;
	Элементы.ПеренумероватьКолонки.Доступность = РучнаяНумерацияКолонокТабличногоДокумента;
	Элементы.РучнаяНумерацияКолонокТабличногоДокумента.Пометка = РучнаяНумерацияКолонокТабличногоДокумента;

КонецПроцедуры // УправлениеВидимостью()

// Процедура выполняет установку реквизитов, связанных с источником данных
//
&НаСервере
Процедура УстановитьИсточник(СписокНастроек = Неопределено)

	Источник        = Неопределено;
	ОбъектИсточника = Неопределено;
	//СписокСохраненныхНастроек.Очистить();
	ПрошлыйМетаданныеСсылкиИсточника = Неопределено;
	МетаданныеИсточника = ПолучитьМетаданныеИсточника();
	Если МетаданныеИсточника = Неопределено Тогда
		ТаблицаЗагружаемыхРеквизитов.Очистить();
	Иначе
		Врем = мВосстановитьЗначение(МетаданныеИсточника.ПолноеИмя());
		//Если НЕ СписокНастроек = Неопределено Тогда
		//	СкопироватьНастройки(Врем, СписокНастроек);
		//	Настройка = ПолучитьНастройкуПоУмолчанию(СписокНастроек);
		//	ВосстановитьНастройкиИзСписка(Настройка);
		//Иначе
		//	ВосстановитьНастройкиИзСписка(Неопределено);
		ЗаполнитьНастройкиКолонок(Неопределено);
		//КонецЕсли;
	КонецЕсли;

	ОбновитьДанныеТабличногоДокументаСервер();

	СпискиВыбораСвязиПоВладельцу.Очистить();

	ТЗ = РеквизитФормыВЗначение("ТаблицаЗагружаемыхРеквизитов");

	Для Каждого ЗагружаемыйРеквизит Из ТЗ Цикл

		СтрокаСписка = СпискиВыбораСвязиПоВладельцу.Добавить();
		СтрокаСписка.ИмяРеквизита = ЗагружаемыйРеквизит.ИмяРеквизита;
		СтрокаСписка.СписокВыбора = ПолучитьСписокСвязейПоВладельцу(ЗагружаемыйРеквизит.ОписаниеТипов, ТЗ);
	КонецЦикла;

КонецПроцедуры

// Процедура выполняет инициализацию служебных переменных и констант модуля
//
&НаСервере
Процедура Инициализация()

	Объект.ДополнительныеСвойства = Новый Структура;

	Объект.ДополнительныеСвойства.Вставить("ПримитивныеТипы", Новый Структура("Число, Строка, Дата, Булево", Тип(
		"Число"), Тип("Строка"), Тип("Дата"), Тип("Булево")));

	Если Объект.ПерваяСтрокаДанныхТабличногоДокумента < 2 Тогда
		Объект.ПерваяСтрокаДанныхТабличногоДокумента = 2;
	КонецЕсли;

	Объект.ДополнительныеСвойства.Вставить("Колонки", Новый Структура);

КонецПроцедуры // ()

///////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ КОМАНД

&НаКлиенте
Процедура КомандаЗагрузить(Команда)

	СтруктураТекстВопроса = ПолучитьТекстВопросаИсточника();
	КоличествоЭлементов = ТабличныйДокумент.ВысотаТаблицы - Объект.ПерваяСтрокаДанныхТабличногоДокумента + 1;
	Если Не ПустаяСтрока(СтруктураТекстВопроса.Ошибка) Тогда
		ПоказатьПредупреждение( , СтруктураТекстВопроса.Ошибка, , "Ошибка при загрузке!");
	Иначе
		ПоказатьВопрос(Новый ОписаниеОповещения("КомандаЗагрузитьЗавершение", ЭтаФорма), "Загрузить "
			+ КоличествоЭлементов + СтруктураТекстВопроса.ТекстВопроса, РежимДиалогаВопрос.ДаНет);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура КомандаЗагрузитьЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт

	Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
		ОчиститьСообщения();
		ЗагрузитьДанныеСервер();
	КонецЕсли;

КонецПроцедуры
&НаКлиенте
Процедура КомандаОткрыть(Команда)

	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

	ДиалогВыбораФайла.Заголовок = "Прочитать табличный документ из файла";
	ДиалогВыбораФайла.Фильтр    = "Табличный документ (*.mxl)|*.mxl|Лист Excel (*.xls,*.xlsx)|*.xls;*.xlsx|Текстовый документ (*.txt)|*.txt|dBase III (*.dbf)|*.dbf|";
	ДиалогВыбораФайла.Показать(Новый ОписаниеОповещения("КомандаОткрытьЗавершение", ЭтаФорма,
		Новый Структура("ДиалогВыбораФайла", ДиалогВыбораФайла)));

КонецПроцедуры

&НаКлиенте
Процедура КомандаОткрытьЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт

	ДиалогВыбораФайла = ДополнительныеПараметры.ДиалогВыбораФайла;
	Если (ВыбранныеФайлы <> Неопределено) Тогда

		ТабличныйДокумент = Элементы.ТабДокумент;
		ФайлНаДиске = Новый Файл(ДиалогВыбораФайла.ПолноеИмяФайла);
		Если нРег(ФайлНаДиске.Расширение) = ".mxl" Тогда
			мПрочитатьТабличныйДокументИзMXL(ДиалогВыбораФайла.ПолноеИмяФайла);
		ИначеЕсли нРег(ФайлНаДиске.Расширение) = ".xls" Или нРег(ФайлНаДиске.Расширение) = ".xlsx" Тогда
			мПрочитатьТабличныйДокументИзExcel(ДиалогВыбораФайла.ПолноеИмяФайла);
		ИначеЕсли нРег(ФайлНаДиске.Расширение) = ".txt" Тогда
			мПрочитатьТабличныйДокументИзТекста(ДиалогВыбораФайла.ПолноеИмяФайла);
		ИначеЕсли нРег(ФайлНаДиске.Расширение) = ".dbf" Тогда
			мПрочитатьТабличныйДокументИзDBF(ДиалогВыбораФайла.ПолноеИмяФайла);
		КонецЕсли;
		УправлениеВидимостью();
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура КомандаСохранить(Команда)

	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);

	ДиалогВыбораФайла.Заголовок = "Сохранить табличный документ в файл";
	ДиалогВыбораФайла.Фильтр    = "Табличный документ (*.mxl)|*.mxl|Лист Excel (*.xls)|*.xls|Текстовый документ (*.txt)|*.txt|";
	ДиалогВыбораФайла.Показать(Новый ОписаниеОповещения("КомандаСохранитьЗавершение", ЭтаФорма,
		Новый Структура("ДиалогВыбораФайла", ДиалогВыбораФайла)));

КонецПроцедуры

&НаКлиенте
Процедура КомандаСохранитьЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт

	ДиалогВыбораФайла = ДополнительныеПараметры.ДиалогВыбораФайла;
	Если (ВыбранныеФайлы <> Неопределено) Тогда

		ТабличныйДокумент = Элементы.ТабДокумент;
		ФайлНаДиске = Новый Файл(ДиалогВыбораФайла.ПолноеИмяФайла);
		Если нРег(ФайлНаДиске.Расширение) = ".mxl" Тогда
			ТабличныйДокумент.НачатьЗапись(Неопределено, ДиалогВыбораФайла.ПолноеИмяФайла,
				ТипФайлаТабличногоДокумента.MXL);
		ИначеЕсли нРег(ФайлНаДиске.Расширение) = ".xls" Тогда
			ТабличныйДокумент.НачатьЗапись(Неопределено, ДиалогВыбораФайла.ПолноеИмяФайла,
				ТипФайлаТабличногоДокумента.XLS);
		ИначеЕсли нРег(ФайлНаДиске.Расширение) = ".txt" Тогда
			ТабличныйДокумент.НачатьЗапись(Неопределено, ДиалогВыбораФайла.ПолноеИмяФайла,
				ТипФайлаТабличногоДокумента.TXT);
		КонецЕсли;

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура КомандаОбновить(Команда)
	ОбновитьДанныеТабличногоДокумента(Неопределено);
КонецПроцедуры

&НаКлиенте
Процедура КомандаКонтрольЗаполнения(Команда)
	КонтрольЗаполненияСервер();
КонецПроцедуры

&НаКлиенте
Процедура КомандаСледующееПримечание(Команда)
	
	//ТабличныйДокумент = Элементы.ТабДокумент;

	Нашли = Ложь;

	Колонка = ТабличныйДокумент.ТекущаяОбласть.Лево + 1;
	Строка  = ТабличныйДокумент.ТекущаяОбласть.Верх;

	Пока Не Нашли И Строка <= ТабличныйДокумент.ВысотаТаблицы Цикл

		Пока Не Нашли И Колонка <= ТабличныйДокумент.ШиринаТаблицы Цикл

			Область = ТабличныйДокумент.Область("R" + Формат(Строка, "ЧГ=") + "C" + Формат(Колонка, "ЧГ="));
			Нашли = Не ПустаяСтрока(Область.Примечание.Текст);

			Колонка = Колонка + 1;
		КонецЦикла;
		Строка = Строка + 1;
		Колонка = 1;
	КонецЦикла;

	Если Нашли Тогда
		ТабличныйДокумент.ТекущаяОбласть = Область;
	Иначе
		Сообщить("Достигнут конец документа", СтатусСообщения.Информация);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура КомандаПредыдущееПримечание(Команда)
	
	//ТабличныйДокумент = Элементы.ТабДокумент;

	Нашли = Ложь;

	Колонка = ТабличныйДокумент.ТекущаяОбласть.Лево - 1;
	Строка  = ТабличныйДокумент.ТекущаяОбласть.Верх;

	Пока Не Нашли И Строка > 0 Цикл

		Пока Не Нашли И Колонка > 0 Цикл

			Область = ТабличныйДокумент.Область("R" + Формат(Строка, "ЧГ=") + "C" + Формат(Колонка, "ЧГ="));
			Нашли = Не ПустаяСтрока(Область.Примечание.Текст);

			Колонка = Колонка - 1;
		КонецЦикла;
		Строка = Строка - 1;
		Колонка = ТабличныйДокумент.ШиринаТаблицы;
	КонецЦикла;

	Если Нашли Тогда
		ТабличныйДокумент.ТекущаяОбласть = Область;
	Иначе
		Сообщить("Достигнуто начало документа", СтатусСообщения.Информация);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура КомандаВосстановитьЗначенияИзФайла(Команда)

	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	ДиалогВыбораФайла.Заголовок	= "Восстановить значения из файла";
	ДиалогВыбораФайла.Фильтр	= "Настройка загрузки в табличный документ (*.mxlz)|*.mxlz|Все файлы (*.*)|*.*|";

	ДиалогВыбораФайла.Показать(Новый ОписаниеОповещения("КомандаВосстановитьЗначенияИзФайлаЗавершение1", ЭтаФорма,
		Новый Структура("ДиалогВыбораФайла", ДиалогВыбораФайла)));

КонецПроцедуры

&НаКлиенте
Процедура КомандаВосстановитьЗначенияИзФайлаЗавершение1(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт

	ДиалогВыбораФайла = ДополнительныеПараметры.ДиалогВыбораФайла;
	Если (ВыбранныеФайлы <> Неопределено) Тогда
		Настройки = мПрочитатьНастройкиИзФайла(ДиалогВыбораФайла.ПолноеИмяФайла);
		ЗаполнитьНастройкиКолонок(Настройки);
		УстановитьСписокТабличныхЧастей();
		ОбновитьДанныеТабличногоДокумента(Новый ОписаниеОповещения("КомандаВосстановитьЗначенияИзФайлаЗавершение",
			ЭтаФорма), Истина);
	Иначе
		КомандаВосстановитьЗначенияИзФайлаФрагмент();
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура КомандаВосстановитьЗначенияИзФайлаЗавершение(Результат, ДополнительныеПараметры) Экспорт

	КомандаВосстановитьЗначенияИзФайлаФрагмент();

КонецПроцедуры

&НаКлиенте
Процедура КомандаВосстановитьЗначенияИзФайлаФрагмент()

	УправлениеВидимостью();

КонецПроцедуры

&НаКлиенте
Процедура КомандаСохранитьЗначенияВФайл(Команда)

	Настройки = ПолучитьНастройки();
	Если Настройки = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);

	ДиалогВыбораФайла.Заголовок = "Сохранить значения настройки в файл";
	ДиалогВыбораФайла.Фильтр    = "Настройка загрузки в табличный документ (*.mxlz)|*.mxlz|Все файлы (*.*)|*.*|";
	ДиалогВыбораФайла.Показать(Новый ОписаниеОповещения("КомандаСохранитьЗначенияВФайлЗавершение", ЭтаФорма,
		Новый Структура("ДиалогВыбораФайла, Настройки", ДиалогВыбораФайла, Настройки)));

КонецПроцедуры

&НаКлиенте
Процедура КомандаСохранитьЗначенияВФайлЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт

	ДиалогВыбораФайла = ДополнительныеПараметры.ДиалогВыбораФайла;
	Настройки = ДополнительныеПараметры.Настройки;
	Если (ВыбранныеФайлы <> Неопределено) Тогда

		Настройки.НачатьЗапись(Неопределено, ДиалогВыбораФайла.ПолноеИмяФайла);

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура КомандаВосстановитьЗначения(Команда)

	ФормаВыбораНастройки = ПолучитьФорму(ИдентификаторОбработки() + ".Форма.ФормаВыбораНастройки", , ЭтаФорма);
	ФормаВыбораНастройки.СписокНастроек = СписокСохраненныхНастроек;
	ТекущиеДанные = ФормаВыбораНастройки.Открыть();
	Если Не ТекущиеДанные = Неопределено Тогда
		ЗаполнитьНастройкиКолонок(ТекущиеДанные.Значение);
	КонецЕсли;

	мСохранитьЗначение(ИдентификаторОбработки(), ФормаВыбораНастройки.СписокНастроек);

КонецПроцедуры

&НаКлиенте
Процедура КомандаСохранитьЗначения(Команда)

	ФормаСохраненияНастройки = ПолучитьФорму(ИдентификаторОбработки() + ".Форма.ФормаСохраненияНастройки", , ЭтаФорма);
	Если Не СписокСохраненныхНастроек.Количество() = 0 Тогда
		//ФормаСохраненияНастройки.СписокНастроек = СписокСохраненныхНастроек;
		Для Каждого Стр Из СписокСохраненныхНастроек Цикл

			НовСтр = ФормаСохраненияНастройки.СписокНастроек.Добавить();
			НовСтр.Пометка = Стр.Пометка;
			НовСтр.Представление = Стр.Представление;

		КонецЦикла;
	КонецЕсли;

	ТекущиеДанные = ФормаСохраненияНастройки.Открыть();

	Если Не ТекущиеДанные = Неопределено Тогда
		
		//ПолучитьНастройкиСписком(ТекущиеДанные.Значение);
		//СкопироватьНастройки(ФормаСохраненияНастройки.СписокНастроек);
		//УстановитьТекущиеНастройки(СписокСохраненныхНастроек, ТекущиеДанные.Пометка, ТекущиеДанные.Представление, ПолучитьСтруктуруНастроек());
		мСохранитьЗначение(ИдентификаторОбработки(), СписокСохраненныхНастроек);

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура КомандаПеречитать(Команда)
	ЗаполнитьНастройкиКолонок(Неопределено);
КонецПроцедуры

&НаКлиенте
Процедура КомандаУстановитьФлажки(Команда)
	Для Каждого ЗагружаемыйРеквизит Из ТаблицаЗагружаемыхРеквизитов Цикл
		ЗагружаемыйРеквизит.Пометка = Истина;
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура КомандаСнятьФлажки(Команда)
	Для Каждого ЗагружаемыйРеквизит Из ТаблицаЗагружаемыхРеквизитов Цикл
		ЗагружаемыйРеквизит.Пометка = Ложь;
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура КомандаРучнаяНумерацияКолонокТабличногоДокумента(Команда)
	Элементы.РучнаяНумерацияКолонокТабличногоДокумента.Пометка = Не Элементы.РучнаяНумерацияКолонокТабличногоДокумента.Пометка;
	Объект.РучнаяНумерацияКолонокТабличногоДокумента = Элементы.РучнаяНумерацияКолонокТабличногоДокумента.Пометка;
	УправлениеВидимостью();
КонецПроцедуры

&НаКлиенте
Процедура КомандаПеренумероватьКолонки(Команда)
	НомерКолонки = 1;
	Для Каждого Реквизит Из ТаблицаЗагружаемыхРеквизитов Цикл
		Если Реквизит.Пометка Тогда
			Если Не Реквизит.НомерКолонки = НомерКолонки Тогда
				Реквизит.НомерКолонки = НомерКолонки;
			КонецЕсли;
			НомерКолонки = НомерКолонки + 1;
		Иначе
			Реквизит.НомерКолонки = 0;
		КонецЕсли;

		Если Реквизит.НомерКолонки = 0 И Реквизит.РежимЗагрузки = "Искать" Тогда
			Реквизит.РежимЗагрузки = "Устанавливать";
		ИначеЕсли Не Реквизит.НомерКолонки = 0 И Реквизит.РежимЗагрузки = "Устанавливать" Тогда
			Реквизит.РежимЗагрузки = "Искать";
		КонецЕсли;

	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура КомандаСобытия(Команда)

	ПараметрыФормы = Новый Структура;
	Если Объект.РежимЗагрузки = 0 Тогда
		ТипИсточника = Новый ОписаниеТипов("СправочникСсылка." + Объект.ТипОбъектаСправочника);
	ИначеЕсли Объект.РежимЗагрузки = 1 Тогда
		Если ЗначениеЗаполнено(Объект.СсылкаИсточника) Тогда
			МассивТипов = Новый Массив;
			МассивТипов.Добавить(ТипЗнч(Объект.СсылкаИсточника));
			ТипИсточника = Новый ОписаниеТипов(МассивТипов);
		Иначе
			ТипИсточника = Новый ОписаниеТипов;
		КонецЕсли;
	ИначеЕсли Объект.РежимЗагрузки = 2 Тогда
		ТипИсточника = "регистрысведений." + НРег(Объект.ИмяВидаРегистра);
	КонецЕсли;
	
	ПараметрыФормы.Вставить("ТипОбъекта", ТипИсточника);
	ПараметрыФормы.Вставить("РежимЗагрузки", Объект.РежимЗагрузки);
	ПараметрыФормы.Вставить("ПередЗаписьюОбъекта", Объект.ПередЗаписьюОбъекта);
	ПараметрыФормы.Вставить("ПриЗаписиОбъекта", Объект.ПриЗаписиОбъекта);
	ПараметрыФормы.Вставить("ПослеДобавленияСтроки", Объект.ПослеДобавленияСтроки);

	ФормаРедактированиеСобытий = ПолучитьФорму(ИдентификаторОбработки() + ".Форма.ФормаРедактированияСобытий",
											   ПараметрыФормы,
											   ЭтаФорма);

	ФормаРедактированиеСобытий.Открыть();

КонецПроцедуры

//@skip-warning
&НаКлиенте
Процедура Подключаемый_ВыполнитьОбщуюКомандуИнструментов(Команда) 
	УИ_ОбщегоНазначенияКлиент.Подключаемый_ВыполнитьОбщуюКомандуИнструментов(ЭтотОбъект, Команда);
КонецПроцедуры



///////////////////////////////////////////////////////////////////////////////
// ПРЕДОПРЕДЕЛЁННЫЕ ОБРАБОТЧИКИ ФОРМЫ

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	Для Каждого МДСправочник Из Метаданные.Справочники Цикл
		Элементы.ТипОбъекта.СписокВыбора.Добавить(МДСправочник.Имя, МДСправочник.Синоним);
	КонецЦикла;
	МДНезависимый = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.Независимый;
	Для Каждого МДРегистрСведений Из Метаданные.РегистрыСведений Цикл
		Если МДРегистрСведений.РежимЗаписи = МДНезависимый Тогда
			Элементы.ИмяВидаРегистра.СписокВыбора.Добавить(МДРегистрСведений.Имя, МДРегистрСведений.Синоним);
		КонецЕсли;
	КонецЦикла;

	Типы = Новый Массив;
	ВидыТипов = Новый Структура("Справочники,Документы");
	Для Каждого КлючИЗначение Из ВидыТипов Цикл
		Для Каждого ОбъектМетаданных Из Метаданные[КлючИЗначение.Ключ] Цикл
			Если ОбъектМетаданных.ТабличныеЧасти.Количество() Тогда
				Типы.Добавить(Тип(СтрЗаменить(ОбъектМетаданных.ПолноеИмя(), ".", "Ссылка.")));
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;

	Элементы.СсылкаИсточника.ОграничениеТипа = Новый ОписаниеТипов(Типы);

	Объект.РежимЗагрузки           = мВосстановитьЗначение("РежимЗагрузки");
	Объект.ИмяВидаРегистра         = мВосстановитьЗначение("ИмяВидаРегистра");
	Объект.ТипОбъектаСправочника   = мВосстановитьЗначение("ТипОбъектаСправочника");
	Объект.СсылкаИсточника         = мВосстановитьЗначение("СсылкаИсточника");

	УстановитьСписокТабличныхЧастей();

	ТабличнаяЧастьИсточника = мВосстановитьЗначение("ТабличнаяЧастьИсточника");

	Инициализация();

	УстановитьИсточник();

	ОбновитьДанныеТабличногоДокументаСервер();
	
	УИ_ОбщегоНазначения.ФормаИнструментаПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);

КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	СисИнфо = Новый СистемнаяИнформация;
	Если Лев(СисИнфо.ВерсияПриложения, 3) = "8.3" Тогда
		Выполнить ("Элементы.СсылкаИсточника.ОтображениеКнопкиВыбора = ОтображениеКнопкиВыбора.ОтображатьВПолеВвода;");
		Выполнить ("Элементы.ТаблицаЗагружаемыхРеквизитовЗначениеПоУмолчанию.ОтображениеКнопкиВыбора = ОтображениеКнопкиВыбора.ОтображатьВПолеВвода;");
	КонецЕсли;

	УправлениеВидимостью();
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии()
	ПриЗакрытииНаСервере();
КонецПроцедуры


///////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ ЭЛЕМЕНТОВ ФОРМЫ

&НаКлиенте
Процедура РежимЗагрузкиПриИзменении(Элемент)
	Объект.ТипОбъектаСправочника	= Неопределено;
	Объект.СсылкаИсточника			= Неопределено;
	Объект.ИмяВидаРегистра			= Неопределено;
	Объект.ТабличнаяЧастьИсточника	= Неопределено;
	УстановитьСписокТабличныхЧастей();
	УстановитьИсточник();
	УправлениеВидимостью();
КонецПроцедуры

&НаКлиенте
Процедура ТипОбъектаПриИзменении(Элемент)
	УстановитьИсточник();
	УправлениеВидимостью();
КонецПроцедуры

&НаКлиенте
Процедура ТипОбъектаОткрытие(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	Если ПустаяСтрока(Объект.ТипОбъектаСправочника) Тогда
		Возврат;
	КонецЕсли;

	Форма = ПолучитьФорму("Справочник." + Объект.ТипОбъектаСправочника + ".ФормаСписка");
	Форма.Открыть();
КонецПроцедуры

&НаКлиенте
Процедура СсылкаИсточникаПриИзменении(Элемент)
	УстановитьСписокТабличныхЧастей();
	УстановитьИсточник();
КонецПроцедуры

&НаКлиенте
Процедура ТабличнаяЧастьИсточникаПриИзменении(Элемент)
	УстановитьИсточник();
	УправлениеВидимостью();
КонецПроцедуры

&НаКлиенте
Процедура ИмяВидаРегистраПриИзменении(Элемент)
	УстановитьИсточник();
	УправлениеВидимостью();
КонецПроцедуры

&НаКлиенте
Процедура ИмяВидаРегистраОткрытие(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	Если ПустаяСтрока(Объект.ИмяВидаРегистра) Тогда
		Возврат;
	КонецЕсли;

	Форма = ПолучитьФорму("РегистрСведений." + Объект.ИмяВидаРегистра + ".ФормаСписка");
	Форма.Открыть();
КонецПроцедуры

///////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ ТАБЛИЦЫ ЗНАЧЕНИЙ ЗАГРУЖАЕМЫХ РЕКВИЗИТОВ

&НаКлиенте
Процедура ТаблицаЗагружаемыхРеквизитовОписаниеТиповНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ТекДанные = Элементы.ТаблицаЗагружаемыхРеквизитов.ТекущиеДанные;
	Элемент.ДоступныеТипы = ТекДанные.ДоступныеТипы;
КонецПроцедуры

&НаКлиенте
Процедура ТаблицаЗагружаемыхРеквизитовПредставлениеДопУсловийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ТекДанные = Элементы.ТаблицаЗагружаемыхРеквизитов.ТекущиеДанные;
	СтандартнаяОбработка = Ложь;
	Если ТекДанные.РежимЗагрузки = "Вычислять" Тогда
		ПараметрыФормы = Новый Структура;
		ПараметрыФормы.Вставить("Выражение", ТекДанные.Выражение);
		ПараметрыФормы.Вставить("ТипРезультата", ТекДанные.ОписаниеТипов);
		ПараметрыФормы.Вставить("КолонкиСтроки", Объект.ДополнительныеСвойства.Колонки);
		ФормаРедактированияВыражения = ПолучитьФорму(ИдентификаторОбработки() + ".Форма.ФормаРедактированияВыражения",
													 ПараметрыФормы,
													 ЭтаФорма);

		ФормаРедактированияВыражения.Открыть();
		//Если ФормаРедактированияВыражения.Открыть() = Истина Тогда
		//	ТекДанные.Выражение = ПолеТекстовогоДокумента.ПолучитьТекст();
		//КонецЕсли;
	Иначе
		ДоступныеТипы	= ТекДанные.ОписаниеТипов;
		СписокВыбораВладельца	= ПолучитьСписокВыбораСвязиПоВладельцу(ТекДанные.ИмяРеквизита);
		ФормаРедактированияСвязи = ПолучитьФорму(ИдентификаторОбработки() + ".Форма.ФормаРедактированияСвязи", ,
			ЭтаФорма);
		ФормаРедактированияСвязи.ИспользуемыеТипы = ДоступныеТипы;
		ФормаРедактированияСвязи.ИскатьПо = ТекДанные.ИскатьПо;
		ФормаРедактированияСвязи.ИспользоватьВладельца = (СписокВыбораВладельца.Количество() > 0);
		ФормаРедактированияСвязи.СвязьПоВладельцу = ТекДанные.СвязьПоВладельцу;

		СписокВыбораИскатьПо = ПолучитьСписокИменПредставлений(ТекДанные.ОписаниеТипов);
		Сп = ФормаРедактированияСвязи.Элементы.ИскатьПо.СписокВыбора;
		Сп.Очистить();
		Для Каждого ЭлСписка Из СписокВыбораИскатьПо Цикл
			Сп.Добавить(ЭлСписка.Значение, ЭлСписка.Представление);
		КонецЦикла;

		Сп = ФормаРедактированияСвязи.Элементы.СвязьПоВладельцу.СписокВыбора;
		Сп.Очистить();
		Для Каждого ЭлСписка Из СписокВыбораВладельца Цикл
			Сп.Добавить(ЭлСписка.Значение, ЭлСписка.Представление);
		КонецЦикла;
		ФормаРедактированияСвязи.Открыть();
		//Если ФормаРедактированияСвязи.Открыть() = Истина Тогда
		//	ТекДанные.ИскатьПо = ФормаРедактированияСвязи.ИскатьПо;
		//	ТекДанные.СвязьПоВладельцу = ФормаРедактированияСвязи.СвязьПоВладельцу;
		//КонецЕсли;
	КонецЕсли;
	//Если ТекДанные.РежимЗагрузки = "Вычислять" Тогда
	//	ТекДанные.ПредставлениеДопУсловий = ТекДанные.Выражение;
	//Иначе
	//	ТекДанные.ПредставлениеДопУсловий = ?(ПустаяСтрока(ТекДанные.ИскатьПо), "", "Искать по "+ТекДанные.ИскатьПо)
	//			+?(ПустаяСтрока(ТекДанные.СвязьПоВладельцу), "", " по владельцу "+ТекДанные.СвязьПоВладельцу);
	//КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ТаблицаЗагружаемыхРеквизитовПредставлениеДопУсловийОчистка(Элемент, СтандартнаяОбработка)
	ТекДанные = Элементы.ТаблицаЗагружаемыхРеквизитов.ТекущиеДанные;
	ТекДанные.ПредставлениеДопУсловий = "";
	ТекДанные.ИскатьПо = "";
	ТекДанные.СвязьПоВладельцу = "";
КонецПроцедуры

&НаКлиенте
Процедура ТаблицаЗагружаемыхРеквизитовРежимЗагрузкиПриИзменении(Элемент)
	ТекДанные = Элементы.ТаблицаЗагружаемыхРеквизитов.ТекущиеДанные;
	Если ТекДанные.РежимЗагрузки = "Вычислять" Тогда
		ТекДанные.ПредставлениеДопУсловий = ТекДанные.Выражение;
	Иначе
		ТекДанные.ПредставлениеДопУсловий = ?(ПустаяСтрока(ТекДанные.ИскатьПо), "", "Искать по " + ТекДанные.ИскатьПо)
			+ ?(ПустаяСтрока(ТекДанные.СвязьПоВладельцу), "", " по владельцу " + ТекДанные.СвязьПоВладельцу);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
	Если ТипЗнч(ВыбранноеЗначение) = Тип("Структура") Тогда

		Если ВыбранноеЗначение.Источник = "ФормаРедактированияСобытий" И ВыбранноеЗначение.Результат = Истина Тогда
			Объект.ПередЗаписьюОбъекта		= ВыбранноеЗначение.ПередЗаписьюОбъекта;
			Объект.ПриЗаписиОбъекта			= ВыбранноеЗначение.ПриЗаписиОбъекта;
			Объект.ПослеДобавленияСтроки	= ВыбранноеЗначение.ПослеДобавленияСтроки;
		ИначеЕсли ВыбранноеЗначение.Источник = "ФормаРедактированияВыражения" И ВыбранноеЗначение.Результат = Истина Тогда
			ТекДанные = Элементы.ТаблицаЗагружаемыхРеквизитов.ТекущиеДанные;
			ТекДанные.Выражение = ВыбранноеЗначение.Выражение;
			ТекДанные.ПредставлениеДопУсловий = ТекДанные.Выражение;
		ИначеЕсли ВыбранноеЗначение.Источник = "ФормаРедактированияСвязи" И ВыбранноеЗначение.Результат = Истина Тогда
			ТекДанные = Элементы.ТаблицаЗагружаемыхРеквизитов.ТекущиеДанные;
			ТекДанные.ИскатьПо = ВыбранноеЗначение.ИскатьПо;
			ТекДанные.СвязьПоВладельцу = ВыбранноеЗначение.СвязьПоВладельцу;
			ТекДанные.ПредставлениеДопУсловий = ?(ПустаяСтрока(ТекДанные.ИскатьПо), "", "Искать по "
				+ ТекДанные.ИскатьПо) + ?(ПустаяСтрока(ТекДанные.СвязьПоВладельцу), "", " по владельцу "
				+ ТекДанные.СвязьПоВладельцу);
		КонецЕсли;

	КонецЕсли;
КонецПроцедуры
